Skip to content

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