mirror of
https://gitee.com/dromara/sa-token.git
synced 2025-09-20 02:29:27 +08:00
文档新增一个项目同时搭建两个 sso-server 服务 的示例
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
}
|
@@ -10,7 +10,6 @@
|
||||
<link rel="shortcut icon" type="image/x-icon" href="logo.png">
|
||||
<link rel="stylesheet" href="./static/doc.css">
|
||||
<link rel="stylesheet" href="./static/vue.css">
|
||||
<script type="text/javascript" src="https://cdn.wwads.cn/js/makemoney.js" async></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="doc-header">
|
||||
@@ -229,6 +228,8 @@
|
||||
})();
|
||||
</script>
|
||||
|
||||
<script type="text/javascript" src="https://cdn.wwads.cn/js/makemoney.js" async></script>
|
||||
|
||||
<!-- 友盟 -->
|
||||
<div style="height: 0px; overflow: hidden;">
|
||||
<script type="text/javascript" src="https://s4.cnzz.com/z_stat.php?id=1279646043&web_id=1279646043"></script>
|
||||
|
@@ -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>
|
||||
|
||||
|
@@ -25,6 +25,7 @@ public class SaSsoProcessor {
|
||||
*/
|
||||
public SaSsoTemplate ssoTemplate = SaSsoUtil.ssoTemplate;
|
||||
|
||||
|
||||
// ----------- SSO-Server 端路由分发 -----------
|
||||
|
||||
/**
|
||||
|
@@ -35,7 +35,6 @@ public class SaSsoTemplate {
|
||||
*/
|
||||
public ApiName apiName = new ApiName();
|
||||
|
||||
|
||||
/**
|
||||
* 所有参数名称
|
||||
*/
|
||||
|
@@ -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) {
|
||||
|
@@ -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 基于路由的过滤式鉴权(增加了注解的处理);使用优先级要低些
|
||||
|
Reference in New Issue
Block a user