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="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>
|
||||||
|
@@ -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>
|
||||||
|
|
||||||
|
@@ -25,6 +25,7 @@ public class SaSsoProcessor {
|
|||||||
*/
|
*/
|
||||||
public SaSsoTemplate ssoTemplate = SaSsoUtil.ssoTemplate;
|
public SaSsoTemplate ssoTemplate = SaSsoUtil.ssoTemplate;
|
||||||
|
|
||||||
|
|
||||||
// ----------- SSO-Server 端路由分发 -----------
|
// ----------- SSO-Server 端路由分发 -----------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -35,7 +35,6 @@ public class SaSsoTemplate {
|
|||||||
*/
|
*/
|
||||||
public ApiName apiName = new ApiName();
|
public ApiName apiName = new ApiName();
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 所有参数名称
|
* 所有参数名称
|
||||||
*/
|
*/
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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 基于路由的过滤式鉴权(增加了注解的处理);使用优先级要低些
|
||||||
|
Reference in New Issue
Block a user