diff --git a/sa-token-demo/sa-token-demo-sso-server/src/main/java/com/pj/sso/HomeController.java b/sa-token-demo/sa-token-demo-sso-server/src/main/java/com/pj/sso/HomeController.java deleted file mode 100644 index 67344088..00000000 --- a/sa-token-demo/sa-token-demo-sso-server/src/main/java/com/pj/sso/HomeController.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.pj.sso; - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import cn.dev33.satoken.context.SaHolder; -import cn.dev33.satoken.stp.StpUtil; - -/** - * SSO 平台中心模式示例,跳连接进入子系统 - * - * @author kong - * @since 2022-10-24 - */ -@RestController -public class HomeController { - - /** - * 平台化首页 - * @return - */ - @RequestMapping("/home") - public Object index() { - // 如果未登录,则先去登录 - if(StpUtil.isLogin() == false) { - return SaHolder.getResponse().redirect("/sso/auth"); - } - - // 拼接各个子系统的地址,格式形如:/sso/auth?redirect=${子系统首页}/sso/login?back=${子系统首页} - String link1 = "/sso/auth?redirect=http://sa-sso-client1.com:9001/sso/login?back=http://sa-sso-client1.com:9001/"; - String link2 = "/sso/auth?redirect=http://sa-sso-client2.com:9001/sso/login?back=http://sa-sso-client2.com:9001/"; - String link3 = "/sso/auth?redirect=http://sa-sso-client3.com:9001/sso/login?back=http://sa-sso-client3.com:9001/"; - - // 组织网页结构返回到前端 - String title = "

SSO 平台首页

"; - String client1 = "

进入Client1系统

"; - String client2 = "

进入Client2系统

"; - String client3 = "

进入Client3系统

"; - - return title + client1 + client2 + client3; - } - -} diff --git a/sa-token-demo/sa-token-demo-sso-server/src/main/java/com/pj/sso/SsoServerController.java b/sa-token-demo/sa-token-demo-sso-server/src/main/java/com/pj/sso/SsoServerController.java index 8328c8a2..9f6ecfce 100644 --- a/sa-token-demo/sa-token-demo-sso-server/src/main/java/com/pj/sso/SsoServerController.java +++ b/sa-token-demo/sa-token-demo-sso-server/src/main/java/com/pj/sso/SsoServerController.java @@ -31,7 +31,7 @@ public class SsoServerController { public Object ssoRequest() { return SaSsoProcessor.instance.serverDister(); } - + // 配置SSO相关参数 @Autowired private void configSso(SaSsoConfig sso) { diff --git a/sa-token-doc/doc.html b/sa-token-doc/doc.html index 8354e051..3bfebf29 100644 --- a/sa-token-doc/doc.html +++ b/sa-token-doc/doc.html @@ -10,7 +10,6 @@ -
@@ -229,6 +228,8 @@ })(); + +
diff --git a/sa-token-doc/sso/sso-questions.md b/sa-token-doc/sso/sso-questions.md index 0da27aac..1921bec3 100644 --- a/sa-token-doc/sso/sso-questions.md +++ b/sa-token-doc/sso/sso-questions.md @@ -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("登录失败!"); + } + +} +``` + + +
+--- +
还有其它问题? diff --git a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/SaSsoProcessor.java b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/SaSsoProcessor.java index 8bda2550..9015610c 100644 --- a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/SaSsoProcessor.java +++ b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/SaSsoProcessor.java @@ -24,6 +24,7 @@ public class SaSsoProcessor { * 底层 SaSsoTemplate 对象 */ public SaSsoTemplate ssoTemplate = SaSsoUtil.ssoTemplate; + // ----------- SSO-Server 端路由分发 ----------- diff --git a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/SaSsoTemplate.java b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/SaSsoTemplate.java index 38f05c19..54f85e13 100644 --- a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/SaSsoTemplate.java +++ b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/SaSsoTemplate.java @@ -35,7 +35,6 @@ public class SaSsoTemplate { */ public ApiName apiName = new ApiName(); - /** * 所有参数名称 */ diff --git a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/name/ApiName.java b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/name/ApiName.java index 41e83ed7..b3069532 100644 --- a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/name/ApiName.java +++ b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/name/ApiName.java @@ -34,7 +34,7 @@ public class ApiName { /** * 批量修改path,新增固定前缀 - * @param prefix / + * @param prefix 示例值:/sso-user、/sso-admin * @return 对象自身 */ public ApiName addPrefix(String prefix) { @@ -51,7 +51,7 @@ public class ApiName { /** * 批量修改path,替换掉 /sso 固定前缀 - * @param prefix / + * @param prefix 示例值:/sso-user、/sso-admin * @return 对象自身 */ public ApiName replacePrefix(String prefix) { diff --git a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/integration/SaTokenPathFilter.java b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/integration/SaTokenPathFilter.java index 9814ccf0..6cef0aeb 100644 --- a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/integration/SaTokenPathFilter.java +++ b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/integration/SaTokenPathFilter.java @@ -1,5 +1,17 @@ package cn.dev33.satoken.solon.integration; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.noear.solon.Solon; +import org.noear.solon.core.handle.Action; +import org.noear.solon.core.handle.Context; +import org.noear.solon.core.handle.Filter; +import org.noear.solon.core.handle.FilterChain; +import org.noear.solon.core.handle.Handler; + import cn.dev33.satoken.annotation.SaIgnore; import cn.dev33.satoken.exception.BackResultException; import cn.dev33.satoken.exception.SaTokenException; @@ -8,13 +20,6 @@ import cn.dev33.satoken.filter.SaFilterAuthStrategy; import cn.dev33.satoken.filter.SaFilterErrorStrategy; import cn.dev33.satoken.router.SaRouter; import cn.dev33.satoken.strategy.SaStrategy; -import org.noear.solon.Solon; -import org.noear.solon.core.handle.*; - -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; /** * sa-token 基于路由的过滤式鉴权(增加了注解的处理);使用优先级要低些