SSO 单点登录
Pangea支持快速集成SSO单点登录,可以根据本文档进行操作,需要注意的是,SSO需要完成申请后才能正常使用,可以在登录认证文档中找到申请注意事项的解答。
1、添加依赖
html
<dependency>
<groupId>com.hisense.pangea</groupId>
<artifactId>pangea-common-sso</artifactId>
<version>${pangea.version}</version>
</dependency>
2、配置sso参数
yaml
pangea:
sso:
#以下参数为必要参数
sso-home: ${SSO_HOME_URL:ssodev.hisense.com} #此参数决定所有访问sso的接口是sso测试环境还是sso正式环境
client-id: ${SSO_CLIENT_ID} #在申请SSO认证信息步骤中获取
client-secret: ${SSO_CLIENT_SECRET} #在申请SSO认证信息步骤中获取
#以下参数为可选参数,不配置使用系统默认值。如sso相关接口地址为与以下默认值相同时则不用配置
login-url: https://${pangea.sso.sso-home}/profile/oauth2/authorize
access-token-url: https://${pangea.sso.sso-home}/profile/oauth2/accessToken
user-info-url: https://${pangea.sso.sso-home}/profile/oauth2/profile
logout-url: https://${pangea.sso.sso-home}/logout?service=${pangea.sso.sso-home}
3、获取sso调转地址
为了方便sso跳转登录页,在sso登录组件中的SsoLoginService
服务里框架提供了sso跳转登录地址的拼接服务:
js
/**
* 拼装sso跳转地址
*
* @param redirectUrl 重定向地址 不能为空
* @param targetUrl 回调地址 不能为空
* @param clientId 客户端Id yml配置中已配置则可以为空, 否则不能为空
* @return sso跳转地址
*/
public String ssoJumpToUrl(String redirectUrl, String targetUrl, String clientId)
使用示例:
js
@Service
public class SsoLoginDemo{
private final SsoLoginService ssoLoginService;
public SsoLoginDemo(SsoLoginService ssoLoginService) {
this.ssoLoginService = ssoLoginService;
}
public String ssologin() {
String redirectUrl = "http://pangea.hisense.com";
String targetUrl = "http://pangea.hisense.com";
//此处clientId传null, 内部会取值yml配置文件中配置的clientId
String ssoLoginUrl = ssoLoginService.ssoJumpToUrl(redirectUrl,targetUrl, null);
return ssoLoginUrl;
}
}
4、SSO认证
用户在sso登录页面登录成功后, sso服务会通过回调地址返回一个code
, SSO认证将通过code
换取accessToken
js
/**
* sso认证
*
* @param code sso登录后颁发的code 不能为空,且有效期只有一次
* @param redirectUrl 回调地址 不能为空
* @param clientId 客户端Id yml配置中已配置则可以为空, 否则不能为空
* @param clientSercet 客户端秘钥 yml配置中已配置则可以为空, 否则不能为空
* @return accessToken 有效期12小时
*/
public String ssoAuth(String code, String redirectUrl, String clientId, String clientSercet)
使用示例:
js
@Service
public class SsoLoginDemo{
private final SsoLoginService ssoLoginService;
public SsoLoginDemo(SsoLoginService ssoLoginService) {
this.ssoLoginService = ssoLoginService;
}
public String ssoAuth(String code) {
String redirectUrl = "http://pangea.hisense.com";
String targetUrl = "http://pangea.hisense.com";
//此处传null, 内部会取值yml配置文件中配置的参数
String accessToken = ssoLoginService.ssoAuth(code, redirectUrl,targetUrl, null, null);
return accessToken;
}
}
5、获取用户信息
在获取到accessToken
后就表示该用户已经合法登录sso,我们可以根据accessToken
获取用户信息
js
/**
* accessToken 换取用户信息
*
* @param accessToken sso认证后颁发的token
* @return 用户账号
*/
public String accessTokenToUserInfo(String accessToken)
使用示例:
js
@Service
public class SsoLoginDemo{
private final SsoLoginService ssoLoginService;
public SsoLoginDemo(SsoLoginService ssoLoginService) {
this.ssoLoginService = ssoLoginService;
}
public String ssoAuth(String code) {
String login = ssoLoginService.accessTokenToUserInfo(accessToken);
return login;
}
}
为了方便只获取登录账号信息的系统使用,框架提供了auth认证后直接获取用户信息的服务,即以上第四步骤和第五步骤合二为一。如下:
js
/**
* sso认证并换取用户信息
*
* @param code sso登录后颁发的code 不能为空,且有效期只有一次
* @param redirectUrl 回调地址 不能为空
* @param clientId 客户端Id yml配置中已配置则可以为空, 否则不能为空
* @param clientSercet 客户端秘钥 yml配置中已配置则可以为空, 否则不能为空
* @return 用户账号
*/
public String ssoAuthToUserInfo(String code, String redirectUrl, String clientId, String clientSercet)
使用示例:
js
@Service
public class SsoLoginDemo{
private final SsoLoginService ssoLoginService;
public SsoLoginDemo(SsoLoginService ssoLoginService) {
this.ssoLoginService = ssoLoginService;
}
public String ssoAuth(String code) {
String redirectUrl = "http://pangea.hisense.com";
String targetUrl = "http://pangea.hisense.com";
//此处传null, 内部会取值yml配置文件中配置的参数
String login = ssoLoginService.ssoAuthToUserInfo(code, redirectUrl,targetUrl, null, null);
return login;
}
}
6、sso退出登录
sso退出登录,需要前端调用后端接口,后端接口需自行开发;后端接口需调用sso登录组件中的ssoLoginService.ssoLogout()
服务即可,至此,sso登录组件已集成完毕。 使用示例:
js
public class SsoLoginDemo{
/**
* sso退出登录
* @param redirectUrl 退出后跳转地址
*/
@GetMapping("ssoLogout")
public Result ssoLogout(@RequestParam("redirectUrl") String redirectUrl) {
return Result.ofSuccess((Object) ssoLoginService.ssoLogout(redirectUrl));
}
}