文档新增一个项目同时搭建两个 sso-server 服务 的示例

This commit is contained in:
click33
2022-10-26 13:20:27 +08:00
parent 82b8e79694
commit 79e7cca4cd
8 changed files with 122 additions and 55 deletions

View File

@@ -1,5 +1,9 @@
# Sa-Token-SSO整合-常见问题总结
SSO 集成常见问题整理
[[toc]]
---
### 问在模式一与模式二中Client端 必须通过 Alone-Redis 插件来访问Redis吗
@@ -43,8 +47,108 @@
[SSO-Server 认证中心开放接口](/sso/sso-apidoc)
### 问:怎么在一个项目里同时搭建 sso-server 和 sso-client
难点在于解决两边的路由冲突,示例代码:
``` java
// Sa-Token SSO Controller
@RestController
public class SsoController {
// 处理 SSO-Server 端所有请求
@RequestMapping({"/sso/auth", "/sso/doLogin", "/sso/checkTicket", "/sso/signout"})
public Object ssoServerRequest() {
return SaSsoProcessor.instance.serverDister();
}
// 处理 SSO-Client 端所有请求
@RequestMapping({"/sso/login", "/sso/logout", "/sso/logoutCall"})
public Object ssoClientRequest() {
return SaSsoProcessor.instance.clientDister();
}
// 配置SSO相关参数
@Autowired
private void configSso(SaSsoConfig sso) {
// SSO配置代码参考文档前几章 ...
}
}
```
### 问:我一个项目里有两套账号体系,都需要单点登录,怎么在一个项目里同时搭建两个 sso-server 服务?
首先推荐你不要在一个项目里同时搭建两个 sso-server建议创建两个项目分别搭建各自的 sso-server 服务。
如果一定要在一个项目中搭建两套 sso-server 服务,参考方案如下:
第一套,还是用前面几章文档给出的示例代码。
第二套,修改一些参数属性,使之与第一套不产生冲突,参考代码如下:
``` java
/**
* Sa-Token-SSO 第二套 SSO-Server端 Controller
*/
@RestController
public class SsoUserServerController {
/**
* 新建一个 SaSsoProcessor 请求处理器
*/
public static SaSsoProcessor ssoUserProcessor = new SaSsoProcessor();
static {
// 自定义一个 SaSsoTemplate 对象
SaSsoTemplate ssoUserTemplate = new SaSsoTemplate() {
// 使用的会话对象 是自定义的 StpUserUtil
@Override
public StpLogic getStpLogic() {
return StpUserUtil.stpLogic;
}
};
// 让这个SSO请求处理器使用的路由前缀是 /sso-user而不是原先的 /sso
ssoUserTemplate.apiName.replacePrefix("/sso-user");
// 给这个 SSO 请求处理器使用自定义的 SaSsoTemplate 对象
ssoUserProcessor.ssoTemplate = ssoUserTemplate;
}
/*
* 第二套 sso-server 服务处理所有SSO相关请求
* http://{host}:{port}/sso-user/auth -- 单点登录授权地址接受参数redirect=授权重定向地址
* http://{host}:{port}/sso-user/doLogin -- 账号密码登录接口接受参数name、pwd
* http://{host}:{port}/sso-user/checkTicket -- Ticket校验接口isHttp=true时打开接受参数ticket=ticket码、ssoLogoutCall=单点注销回调地址 [可选]
* http://{host}:{port}/sso-user/signout -- 单点注销地址isSlo=true时打开接受参数loginId=账号id、secretkey=接口调用秘钥
*/
@RequestMapping("/sso-user/*")
public Object ssoUserRequest() {
return ssoUserProcessor.serverDister();
}
// 自定义 doLogin 方法 */
// 注意点:
// 1、第2套 sso-server 对应的 RestApi 登录接口也应该更换为 /sso-user/doLogin而不是原先的 /sso/doLogin
// 2、在这里登录函数要使用自定义的 StpUserUtil.login(),而不是原先的 StpUtil.login()
@RequestMapping("/sso-user/doLogin")
public Object ssoUserRequest(String name, String pwd) {
if("sa".equals(name) && "123456".equals(pwd)) {
StpUserUtil.login(10001);
return SaResult.ok("登录成功!").setData(StpUtil.getTokenValue());
}
return SaResult.error("登录失败!");
}
}
```
<br/>
---
<details>
<summary>还有其它问题?</summary>