feat:SSO单点登录功能

This commit is contained in:
xuetao.li
2023-05-18 18:20:07 +08:00
parent e20407f8f0
commit 7f91a29346
5 changed files with 33 additions and 20 deletions
@@ -507,13 +507,13 @@ public class LoginRestController {
@GetMapping("/ssoLogin") @GetMapping("/ssoLogin")
@ResponseBody @ResponseBody
@ApiOperation(value = "SSO,根据Code返回用户信息") @ApiOperation(value = "SSO,根据Code返回用户信息")
public ResponseMessage ssoLogin(String code, HttpServletRequest request){ public ResponseMessage ssoLogin(String code, String redirectUrl, HttpServletRequest request){
if (StrUtil.isBlank(code)) { if (StrUtil.isBlank(code)) {
return Result.error("无法单点登录,code为空"); return Result.error("无法单点登录,code为空");
} }
String username = userService.ssoLogin(code); String account = userService.ssoLogin(code, redirectUrl);
UsernamePasswordToken token = new UsernamePasswordToken(username); UsernamePasswordToken token = new UsernamePasswordToken(account);
return login(request, token); return login(request, token);
} }
@@ -14,7 +14,7 @@ import com.adc.da.sys.service.iservice.IUserEoService;
import com.adc.da.sys.util.EncryptUtil; import com.adc.da.sys.util.EncryptUtil;
import com.adc.da.sys.vo.UserImportVO; import com.adc.da.sys.vo.UserImportVO;
import com.adc.da.sys.vo.UserVO; import com.adc.da.sys.vo.UserVO;
import com.adc.da.sys.vo.iam.SsoResponse; import com.adc.da.sys.vo.iam.SsoTokenResponse;
import com.adc.da.sys.vo.iam.SsoUserInfoResponse; import com.adc.da.sys.vo.iam.SsoUserInfoResponse;
import com.adc.da.util.exception.AdcDaBaseException; import com.adc.da.util.exception.AdcDaBaseException;
import com.adc.da.util.utils.CollectionUtils; import com.adc.da.util.utils.CollectionUtils;
@@ -444,13 +444,13 @@ public class UserEOServiceImpl implements IUserEoService {
* @param code code * @param code code
* @return Url * @return Url
*/ */
private String getTokenByCodeUrl(String code) { private String getTokenByCodeUrl(String code, String redirectUrl) {
return ssoUrl + SsoConstants.GET_TOKEN_PATH return ssoUrl + SsoConstants.GET_TOKEN_PATH
+ SsoConstants.GRANT_TYPE + SsoConstants.AUTHORIZATION_CODE + "&" + SsoConstants.GRANT_TYPE + SsoConstants.AUTHORIZATION_CODE + "&"
+ SsoConstants.CLIENT_ID + ssoClientId + "&" + SsoConstants.CLIENT_ID + ssoClientId + "&"
+ SsoConstants.CLIENT_SECRET + ssoClientSecret + "&" + SsoConstants.CLIENT_SECRET + ssoClientSecret + "&"
+ SsoConstants.CODE + code + "&" + SsoConstants.CODE + code + "&"
+ SsoConstants.REDIRECT_URI + "XXX"; + SsoConstants.REDIRECT_URI + redirectUrl;
} }
/** /**
@@ -464,16 +464,16 @@ public class UserEOServiceImpl implements IUserEoService {
} }
@Override @Override
public String ssoLogin(String code) { public String ssoLogin(String code, String redirectUrl) {
log.info("SSO登录: Code为【{}】", code); log.info("SSO登录: Code为【{}】", code);
//向SSO服务器发送code获取用户token //向SSO服务器发送code获取用户token
String getTokenByCodeUrl = this.getTokenByCodeUrl(code); String getTokenByCodeUrl = this.getTokenByCodeUrl(code, redirectUrl);
String tokenResponse = HttpRequest.post(getTokenByCodeUrl).execute().body(); String tokenResponse = HttpRequest.post(getTokenByCodeUrl).execute().body();
SsoResponse tokenResponseObject = JSONUtil.toBean(tokenResponse, SsoResponse.class); SsoTokenResponse ssoTokenResponseObject = JSONUtil.toBean(tokenResponse, SsoTokenResponse.class);
//获取返回值中的token //获取返回值中的token
String accessToken = tokenResponseObject.getAccess_token(); String accessToken = ssoTokenResponseObject.getAccess_token();
log.info("SSO登录: accessToken为【{}】", accessToken); log.info("SSO登录: accessToken为【{}】", accessToken);
//向SSO服务器发送token获取用户数据 //向SSO服务器发送token获取用户数据
if (StrUtil.isBlank(accessToken)) { if (StrUtil.isBlank(accessToken)) {
@@ -487,15 +487,15 @@ public class UserEOServiceImpl implements IUserEoService {
SsoUserInfoResponse userInfoResponseObject = JSONUtil.toBean(userInfoResponse, SsoUserInfoResponse.class); SsoUserInfoResponse userInfoResponseObject = JSONUtil.toBean(userInfoResponse, SsoUserInfoResponse.class);
//获取返回值中的用户id //获取返回值中的用户id
String userId = userInfoResponseObject.getId(); String userAccount = userInfoResponseObject.getId();
log.info("SSO登录: userId为【{}】", userId); log.info("SSO登录: 用户登录账号为【{}】", userAccount);
//根据用户id取出用户名 //根据用户id取出用户名
UserEO user = getUserById(userId); UserEO user = dao.getUserEOByAccountNotDeleted(userAccount);
if (user == null) { if (user == null) {
log.info("根据用户id取出用户失败"); log.info("根据用户id取出用户失败");
throw new AdcDaBaseException("根据用户id取出用户失败"); throw new AdcDaBaseException("根据用户id取出用户失败");
} }
return user.getUsname(); return user.getAccount();
} }
void checkExcel(List<UserImportVO> list) { void checkExcel(List<UserImportVO> list) {
@@ -77,5 +77,5 @@ public interface IUserEoService {
* @param code * @param code
* @return * @return
*/ */
String ssoLogin(String code); String ssoLogin(String code, String redirectUrl);
} }
@@ -12,13 +12,23 @@ import lombok.NoArgsConstructor;
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class SsoResponse { public class SsoTokenResponse {
/** /**
* 返回的token 必须 * 返回的token 必须
*/ */
private String access_token; private String access_token;
/**
* token类型
*/
private String token_type;
/**
* 过气时间
*/
private Long expires_in;
/** /**
* 刷新token(在应用配置里打开token刷新的开关即可返回该参数) 非必须 * 刷新token(在应用配置里打开token刷新的开关即可返回该参数) 非必须
*/ */
@@ -1,6 +1,5 @@
package com.adc.da.sys.vo.iam; package com.adc.da.sys.vo.iam;
import cn.hutool.system.UserInfo;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@@ -15,11 +14,15 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor @AllArgsConstructor
public class SsoUserInfo { public class SsoUserInfo {
private String account_no; private String ad_account;
private String token_expired; private String user_name;
private String token_gtime; private String work_no;
private Long token_gtime;
private String user_uid;
private UserDetailInfo user_detail_info; private UserDetailInfo user_detail_info;
} }