文档新增一个项目同时搭建两个 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,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 = "<h2>SSO 平台首页</h2>";
String client1 = "<p><a href='" + link1 + "' target='_blank'> 进入Client1系统 </a></p>";
String client2 = "<p><a href='" + link2 + "' target='_blank'> 进入Client2系统 </a></p>";
String client3 = "<p><a href='" + link3 + "' target='_blank'> 进入Client3系统 </a></p>";
return title + client1 + client2 + client3;
}
}

View File

@@ -10,7 +10,6 @@
<link rel="shortcut icon" type="image/x-icon" href="logo.png"> <link rel="shortcut icon" type="image/x-icon" href="logo.png">
<link rel="stylesheet" href="./static/doc.css"> <link rel="stylesheet" href="./static/doc.css">
<link rel="stylesheet" href="./static/vue.css"> <link rel="stylesheet" href="./static/vue.css">
<script type="text/javascript" src="https://cdn.wwads.cn/js/makemoney.js" async></script>
</head> </head>
<body> <body>
<div class="doc-header"> <div class="doc-header">
@@ -229,6 +228,8 @@
})(); })();
</script> </script>
<script type="text/javascript" src="https://cdn.wwads.cn/js/makemoney.js" async></script>
<!-- 友盟 --> <!-- 友盟 -->
<div style="height: 0px; overflow: hidden;"> <div style="height: 0px; overflow: hidden;">
<script type="text/javascript" src="https://s4.cnzz.com/z_stat.php?id=1279646043&web_id=1279646043"></script> <script type="text/javascript" src="https://s4.cnzz.com/z_stat.php?id=1279646043&web_id=1279646043"></script>

View File

@@ -1,5 +1,9 @@
# Sa-Token-SSO整合-常见问题总结 # Sa-Token-SSO整合-常见问题总结
SSO 集成常见问题整理
[[toc]]
--- ---
### 问在模式一与模式二中Client端 必须通过 Alone-Redis 插件来访问Redis吗 ### 问在模式一与模式二中Client端 必须通过 Alone-Redis 插件来访问Redis吗
@@ -43,8 +47,108 @@
[SSO-Server 认证中心开放接口](/sso/sso-apidoc) [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/> <br/>
---
<details> <details>
<summary>还有其它问题?</summary> <summary>还有其它问题?</summary>

View File

@@ -25,6 +25,7 @@ public class SaSsoProcessor {
*/ */
public SaSsoTemplate ssoTemplate = SaSsoUtil.ssoTemplate; public SaSsoTemplate ssoTemplate = SaSsoUtil.ssoTemplate;
// ----------- SSO-Server 端路由分发 ----------- // ----------- SSO-Server 端路由分发 -----------
/** /**

View File

@@ -35,7 +35,6 @@ public class SaSsoTemplate {
*/ */
public ApiName apiName = new ApiName(); public ApiName apiName = new ApiName();
/** /**
* 所有参数名称 * 所有参数名称
*/ */

View File

@@ -34,7 +34,7 @@ public class ApiName {
/** /**
* 批量修改path新增固定前缀 * 批量修改path新增固定前缀
* @param prefix / * @param prefix 示例值:/sso-user、/sso-admin
* @return 对象自身 * @return 对象自身
*/ */
public ApiName addPrefix(String prefix) { public ApiName addPrefix(String prefix) {
@@ -51,7 +51,7 @@ public class ApiName {
/** /**
* 批量修改path替换掉 /sso 固定前缀 * 批量修改path替换掉 /sso 固定前缀
* @param prefix / * @param prefix 示例值:/sso-user、/sso-admin
* @return 对象自身 * @return 对象自身
*/ */
public ApiName replacePrefix(String prefix) { public ApiName replacePrefix(String prefix) {

View File

@@ -1,5 +1,17 @@
package cn.dev33.satoken.solon.integration; 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.annotation.SaIgnore;
import cn.dev33.satoken.exception.BackResultException; import cn.dev33.satoken.exception.BackResultException;
import cn.dev33.satoken.exception.SaTokenException; 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.filter.SaFilterErrorStrategy;
import cn.dev33.satoken.router.SaRouter; import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.strategy.SaStrategy; 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 基于路由的过滤式鉴权(增加了注解的处理);使用优先级要低些 * sa-token 基于路由的过滤式鉴权(增加了注解的处理);使用优先级要低些