添加佛山3院单点登录功能

master
xuhaoxiang 4 years ago
parent 55cfd72308
commit 2622bb8c73

@ -127,6 +127,16 @@
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.13</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.12</version>
</dependency>
</dependencies>
<build>
<finalName>power</finalName>

@ -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<Power_Menu> list = null;
List<User_Dept_Menu> menuList = new ArrayList<>();
Set<String> 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<Power_Dept> powerDeptsList = power_deptService.selectByPrimaryKeys(user.getDeptId());
for(int j=0;j<powerDeptsList.size();j++){
if(j<powerDeptsList.size()-1){
powerDepts.append(powerDeptsList.get(j).getDeptName()).append(",");
}else{
powerDepts.append(powerDeptsList.get(j).getDeptName());
}
}
user.setRemark(powerDepts.toString());
//移除缓存
/*CacheManager.removeCacheByObject(user);
CacheManager.putCache(date,new Cache(date,user,TOKEN_EXPIRE_TIME));*/
ActionScopeUtils.setSessionAttribute("token",token,Integer.valueOf(String.valueOf(TOKEN_EXPIRE_TIME)));
ActionScopeUtils.setSessionAttribute("CURRENT_USER",user,Integer.valueOf(String.valueOf(TOKEN_EXPIRE_TIME)));
CacheManager.putCache(token,new Cache(user,System.currentTimeMillis(),TOKEN_EXPIRE_TIME*1000));
if (!"".equals(token)&&token!=null) {
//返回跳转url
result="http://"+ip+":"+port+"/emr_medical_record/login?token=" + token + "&userName="+userName;
//request.getRequestDispatcher(result).forward(request, response);
response.sendRedirect(result);
} else {
result = "获取登录token失败请检查数据!!";
}
} else {
result = "无法获取用户密码!!";
}
} else {
result = "登录用户不存在!!";
}
}
}else{
result = "SSO平台未成功返回用户信息!!";
}
}
return result;
}
@RequestMapping(value = "into",method = RequestMethod.GET,produces = "text/html;charset=utf-8")
@ResponseBody
public void in(HttpServletRequest request, HttpServletResponse response){
//本项目中接收返回数据的地址
String StringUrl = null;
try {
StringUrl = URLEncoder.encode(urlAddress, "GBK");
try {
response.sendRedirect(oidcAddress+authorizationEndpoint+"?client_id="+clientId+"&redirect_uri="+StringUrl+"&response_type=code&state="+1+"&scope=openid%20profile");
} catch (IOException e) {
e.printStackTrace();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public static String doPost(String url, Map<String, Object> paramMap, Map<String, String> 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<NameValuePair> nvps = new ArrayList<>();
// 通过map集成entrySet方法获取entity
Set<Map.Entry<String, Object>> entrySet = paramMap.entrySet();
// 循环遍历,获取迭代器
Iterator<Map.Entry<String, Object>> iterator = entrySet.iterator();
while (iterator.hasNext()) {
Map.Entry<String, Object> 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;
}
}

@ -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
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

@ -67,5 +67,7 @@ public interface Power_UserMapper {
Power_UserVo selectByPrimaryKey1(Integer userId);
Power_UserVo selectByUserName(String userName);
void updatePersonal(Power_User user);
}

@ -724,6 +724,13 @@
on power_user.role_id = power_role.role_id
where user_id = #{userId,jdbcType=INTEGER}
</select>
<select id="selectByUserName" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from power_user
where user_name = #{userName,jdbcType=INTEGER}
</select>
<!--更新个人资料-->
<update id="updatePersonal" parameterType="com.manage.entity.Power_User">
update power_user

@ -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);

@ -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) {
//取得当前登录账号

Loading…
Cancel
Save