diff --git a/power-admin/pom.xml b/power-admin/pom.xml index 64d4525..8152f0e 100644 --- a/power-admin/pom.xml +++ b/power-admin/pom.xml @@ -127,6 +127,16 @@ org.slf4j slf4j-log4j12 + + org.apache.httpcomponents + httpcore + 4.4.13 + + + org.apache.httpcomponents + httpclient + 4.5.12 + power diff --git a/power-admin/src/main/java/com/manage/controller/SsoLogin.java b/power-admin/src/main/java/com/manage/controller/SsoLogin.java new file mode 100644 index 0000000..02b46d0 --- /dev/null +++ b/power-admin/src/main/java/com/manage/controller/SsoLogin.java @@ -0,0 +1,326 @@ +package com.manage.controller; + + +import com.alibaba.fastjson.JSONObject; +import com.manage.encrypt.Base64; +import com.manage.encrypt.MD5; +import com.manage.entity.Power_Dept; +import com.manage.entity.Power_Menu; +import com.manage.service.Power_DeptService; +import com.manage.service.Power_MenuService; +import com.manage.service.Power_UserService; +import com.manage.service.cache.Cache; +import com.manage.service.cache.CacheManager; +import com.manage.util.ActionScopeUtils; +import com.manage.util.DateUtils; +import com.manage.util.Msg; +import com.manage.vo.Power_UserVo; +import com.manage.vo.User_Dept_Menu; +import org.apache.commons.lang3.StringUtils; +import org.apache.cxf.endpoint.Client; +import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.utils.HttpClientUtils; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.*; + +/** + * Author xuhx + * Date 2021/7/1 + * Time 16:39 + * Description 供无纸化归档使用的接口 + * Description 建党100周年纪念日 + */ +@Controller +@RequestMapping("ssoLogin/") +public class SsoLogin { + private static Logger logger = LoggerFactory.getLogger(HttpClientUtils.class); // 日志记录 + + private static RequestConfig requestConfig = null; + + static { + // 设置请求和传输超时时间 + requestConfig = RequestConfig.custom().setSocketTimeout(600000).setConnectTimeout(600000).build(); + } + + @Autowired + Power_UserService powerUserService; + + @Autowired + private Power_MenuService powerMenuService; + + @Autowired + private Power_DeptService power_deptService; + + @Value("${EMRMEDICALRECORD_IP}") + private String ip; + + @Value("${EMRMEDICALRECORD_PORT}") + private String port; + + @Value("${TOKEN_EXPIRE_TIME}") + private long TOKEN_EXPIRE_TIME; + + @Value("${oidc_address}") + private String oidcAddress; + + @Value("${token_endpoint}") + private String tokenEendpoint; + + @Value("${client_id}") + private String clientId; + + @Value("${client_secret}") + private String clientSecret; + + @Value("${userinfo_endpoint}") + private String userinfoEndpoint; + + @Value("${authorization_endpoint}") + private String authorizationEndpoint; + + @Value("${URL_ADDRESS}") + private String urlAddress; + + + /* + * 单点登录 + * author xuhx + * */ + @RequestMapping(value = "login",method = RequestMethod.GET,produces = "text/html;charset=utf-8") + @ResponseBody + public String login(HttpServletRequest request,HttpServletResponse response,String code,String state) throws Exception { + String result = ""; + CloseableHttpResponse responseNew = null; + CloseableHttpClient httpClient = null; + JSONObject jsonResultToken = null; + String url=oidcAddress+tokenEendpoint; + String StringUrl = URLEncoder.encode(urlAddress, "GBK"); + Map paramMap = new HashMap(); + paramMap.put("client_id",clientId); + paramMap.put("client_secret",clientSecret); + paramMap.put("code",code); + paramMap.put("grant_type","authorization_code"); + paramMap.put("redirect_uri",urlAddress); + String param="client_id="+clientId+"&client_secret="+clientSecret+"&code="+code+"&grant_type=authorization_code&redirect_uri="+StringUrl; + String returnObject =doPost(url,paramMap,null); + String userName=null; + if(returnObject!=null){ + // 把json字符串转换成json对象 + jsonResultToken = JSONObject.parseObject(returnObject); + String accessToken=jsonResultToken.getString("access_token"); + // 通过址默认配置创建一个httpClient实例 + httpClient = HttpClients.createDefault(); + // 创建httpGet远程连接实例 + String userUrl=oidcAddress+userinfoEndpoint; + HttpGet httpGet = new HttpGet(userUrl); + // 设置请求头信息,鉴权 + httpGet.setHeader("Authorization", "Bearer "+accessToken); + httpGet.setConfig(requestConfig); + // 执行get请求得到返回对象 + responseNew = httpClient.execute(httpGet); + // 通过返回对象获取返回数据 + HttpEntity entity = responseNew.getEntity(); + // 通过EntityUtils中的toString方法将结果转换为字符串 + String returnResult = EntityUtils.toString(entity); + // 把json字符串转换成json对象 + JSONObject jsonResult = JSONObject.parseObject(returnResult); + if(jsonResult!=null){ + /*if((jsonResult.getString("username"))!=null&&!"".equals(jsonResult.getString("username"))) { + userName=jsonResult.getString("username"); + }*/ + if((jsonResult.getString("name"))!=null&&!"".equals(jsonResult.getString("name"))) { + userName=jsonResult.getString("name"); + //根据登录名获取用户(需要确保用户登录名唯一) + Power_UserVo user = powerUserService.selectByUserName(userName); + if (user != null) { + String password = MD5.JM(Base64.decode(user.getUserPwd())); + if (password != null && !"".equals(password)) { + //加密(此部分代码来自FontController的getToken方法,用来获取token及相关操作) + String token = UUID.randomUUID().toString(); + List list = null; + List menuList = new ArrayList<>(); + Set menus = new TreeSet<>(); + if (user.getRoleId().equals(0) || user.getRoleId().equals(-100)) { + list = powerMenuService.queryAllPowerMenu(null,user.getRoleId()); + } else { + list = powerMenuService.selectUserAndRoleMenuListPower(user.getUserId(),null); + } + if(null != list && !list.isEmpty()){ + for (Power_Menu power_menu : list) { + User_Dept_Menu deptMenu = new User_Dept_Menu(); + String menuUrl = power_menu.getMenuUrl(); + if (StringUtils.isNotBlank(menuUrl)) { + BeanUtils.copyProperties(power_menu, deptMenu); + deptMenu.setMethodParent(power_menu.getParentId()); + menuList.add(deptMenu); + } + if (StringUtils.isNotBlank(power_menu.getMethod())) { + menus.add(power_menu.getMenuUrl()); + } + } + } + user.setMenuList(menuList); + user.setMenus(menus); + + //设置科室 + StringBuilder powerDepts = new StringBuilder(); + List powerDeptsList = power_deptService.selectByPrimaryKeys(user.getDeptId()); + for(int j=0;j paramMap, Map headerMap) { + + CloseableHttpClient httpClient = null; + CloseableHttpResponse httpResponse = null; + String result = ""; + // 创建httpClient实例 + httpClient = HttpClients.createDefault(); + + // 创建httpPost远程连接实例 + HttpPost httpPost = new HttpPost(url); + RequestConfig requestConfig = null; + // 配置请求参数实例 + requestConfig = RequestConfig.custom().setConnectTimeout(35000)// 设置连接主机服务超时时间 + .setConnectionRequestTimeout(35000)// 设置连接请求超时时间 + .setSocketTimeout(60000)// 设置读取数据连接超时时间 + .build(); + + // 为httpPost实例设置配置 + //httpPost.setConfig(requestConfig); + // 设置请求头 + if (headerMap == null){ + httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");// "application/json" + } else { + for (String key : headerMap.keySet()) { + httpPost.addHeader(key, headerMap.get(key)); + } + } + + // 封装post请求参数 + if (null != paramMap && paramMap.size() > 0) { + List nvps = new ArrayList<>(); + // 通过map集成entrySet方法获取entity + Set> entrySet = paramMap.entrySet(); + // 循环遍历,获取迭代器 + Iterator> iterator = entrySet.iterator(); + while (iterator.hasNext()) { + Map.Entry mapEntry = iterator.next(); + nvps.add(new BasicNameValuePair(mapEntry.getKey(), mapEntry.getValue().toString())); + } + + // 为httpPost设置封装好的请求参数 + try { + httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8")); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + try { + // httpClient对象执行post请求,并返回响应参数对象 + httpResponse = httpClient.execute(httpPost); + // 从响应对象中获取响应内容 + HttpEntity entity = httpResponse.getEntity(); + result = EntityUtils.toString(entity); + } catch (ClientProtocolException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + // 关闭资源 + if (null != httpResponse) { + try { + httpResponse.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != httpClient) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return result; + } + +} diff --git a/power-admin/src/main/resources/config/config.properties b/power-admin/src/main/resources/config/config.properties index 982a973..09ea735 100644 --- a/power-admin/src/main/resources/config/config.properties +++ b/power-admin/src/main/resources/config/config.properties @@ -1,7 +1,7 @@ # \u62E6\u622A\u83DC\u5355\u914D\u7F6E\u6587\u4EF6 ljx 2019-4-27 #interceptRequest \u672A\u767B\u5F55\u4E4B\u524D\u653E\u884C\u3002\u9ED8\u8BA4\u4E3Anone #ajaxRequest ajax\u8BF7\u6C42\u6CA1\u6709\u5BF9\u5E94\u6A21\u5757\uFF0C\u9700\u8981\u653E\u884C\u3002 \u9ED8\u8BA4\u4E3Anone -releaseRequest = /login,/logout,/services,/font,/refuse,/swagger-ui.html,/webjars,/swagger-resources,/v2 +releaseRequest = /login,/logout,/services,/font,/refuse,/swagger-ui.html,/webjars,/swagger-resources,/v2,/ssoLogin ajaxRequest = none #session\u8FC7\u671F\u65F6\u95F4,\u5355\u4F4D\u79D2 @@ -68,4 +68,31 @@ STR_SPLIT = *^:|,. log.days = 90 #\u5B9A\u4E49\u662F\u5426\u4E3A\u957F\u671F\u767B\u5F55\u7528\u6237\u6B21\u6570 -login.times = 3 \ No newline at end of file +login.times = 3 + +#ɭSSO OIDC + +#OIDCṩclient_id +client_id=6225028f50057f2c5923c0643f16cdd81144f6accfbfb785d291ed8852f4ac3c + +#OIDCṩclient_secret +client_secret=144082e19b419304cc38cdd9df42f349782e96170a4337bc2f5f3dbdfeae0323 + +#OIDCĵַ +oidc_address= https://gitlab.com + +#Ȩַ޷ʹ÷ +#ֹܣ +authorization_endpoint=/oauth/authorize + +#ȡTokenӿڣ޷ʹ÷ +#ֹܣ +token_endpoint=/oauth/token + +#ûϢӿڣ޷ʹ÷ +#ֹܣ +userinfo_endpoint=/oauth/userinfo + +#ʵַ +URL_ADDRESS=http://10.100.23.1:8080/power/ssoLogin/login + diff --git a/power-dao/src/main/java/com/manage/dao/Power_UserMapper.java b/power-dao/src/main/java/com/manage/dao/Power_UserMapper.java index af61a37..135655e 100644 --- a/power-dao/src/main/java/com/manage/dao/Power_UserMapper.java +++ b/power-dao/src/main/java/com/manage/dao/Power_UserMapper.java @@ -67,5 +67,7 @@ public interface Power_UserMapper { Power_UserVo selectByPrimaryKey1(Integer userId); + Power_UserVo selectByUserName(String userName); + void updatePersonal(Power_User user); } \ No newline at end of file diff --git a/power-dao/src/main/resources/mapper/Power_UserMapper.xml b/power-dao/src/main/resources/mapper/Power_UserMapper.xml index 5f72541..1985887 100644 --- a/power-dao/src/main/resources/mapper/Power_UserMapper.xml +++ b/power-dao/src/main/resources/mapper/Power_UserMapper.xml @@ -724,6 +724,13 @@ on power_user.role_id = power_role.role_id where user_id = #{userId,jdbcType=INTEGER} + + update power_user diff --git a/power-service/src/main/java/com/manage/service/Power_UserService.java b/power-service/src/main/java/com/manage/service/Power_UserService.java index 0d554a1..f6c3b5e 100644 --- a/power-service/src/main/java/com/manage/service/Power_UserService.java +++ b/power-service/src/main/java/com/manage/service/Power_UserService.java @@ -22,6 +22,8 @@ public interface Power_UserService { Power_UserVo selectByPrimaryKey(Integer userId); + Power_UserVo selectByUserName(String userName); + int updateByPrimaryKeySelective(Power_User record,HttpServletRequest request); int updateByPrimaryKey(Power_User record); diff --git a/power-service/src/main/java/com/manage/service/ipml/Power_UserServiceImpl.java b/power-service/src/main/java/com/manage/service/ipml/Power_UserServiceImpl.java index f86bb7d..72ec245 100644 --- a/power-service/src/main/java/com/manage/service/ipml/Power_UserServiceImpl.java +++ b/power-service/src/main/java/com/manage/service/ipml/Power_UserServiceImpl.java @@ -99,6 +99,12 @@ public class Power_UserServiceImpl implements Power_UserService { return power_user; } + @Override + public Power_UserVo selectByUserName(String userName) { + Power_UserVo power_user = powerUserMapper.selectByUserName(userName); + return power_user; + } + @Override public int updateByPrimaryKeySelective(Power_User powerUser,HttpServletRequest request) { //取得当前登录账号