mirror of
https://gitee.com/dromara/sa-token.git
synced 2026-05-14 12:52:08 +08:00
增加常见报错问答
This commit is contained in:
@@ -6,24 +6,25 @@ SSO 集成常见问题整理
|
||||
|
||||
---
|
||||
|
||||
### 问:在模式一与模式二中,Client端 必须通过 Alone-Redis 插件来访问Redis吗?
|
||||
答:不必须,只是推荐,权限缓存与业务缓存分离后会减少 `SSO-Redis` 的访问压力,且可以避免多个 `Client端` 的缓存读写冲突
|
||||
### 问:在模式一与模式二中,Client端 必须通过 Alone-Redis 插件来访问 Redis 吗?
|
||||
答:不必须,只是推荐,权限缓存与业务缓存分离后会减少 `SSO-Redis` 的访问压力,且可以避免多个 `Client端` 的缓存读写冲突。
|
||||
|
||||
|
||||
### 问:将旧有系统改造为单点登录时,应该注意哪些?
|
||||
答:建议不要把其中一个系统改造为SSO服务端,而是新起一个项目作为Server端,所有旧有项目全部作为Client端与此对接
|
||||
### 问:搭建好 sso-server 或 sso-client 服务后,访问返回:`{"msg": "not handle"}`。
|
||||
|
||||
返回这个信息,代表你访问的路由有错误,比如说:
|
||||
|
||||
### 问:SSO模式二,第一个域名登录成功之后其他两个不会自动登录?
|
||||
答:系统1登录成功之后,系统二与系统三需要点击登录按钮,才会登录成功
|
||||
- 统一认证登录地址是:`http://{host}:{port}/sso/auth`。
|
||||
- 而你访问的却是:`http://{host}:{port}/sso/auth2`。
|
||||
|
||||
> 第一个系统,需要:点击 [登录] 按钮 -> 跳转到登录页 -> 输账号密码 -> 登录成功 <br>
|
||||
> 第二个系统,需要:点击 [登录] 按钮 -> 登录成功 <br>
|
||||
> 第三个系统,需要:点击 [登录] 按钮 -> 登录成功 (免去重复跳转登录页输入账号密码的步骤)
|
||||
地址写错了,框架就不会处理这个请求,会直接返回 `{"msg": "not handle"}`,所有开放地址可参考:[SSO 开放接口](/sso/sso-apidoc)
|
||||
|
||||
如果仔细检查地址后没有写错,却依然返回了这个信息,那有可能是对应的接口没有打开,比如说:
|
||||
|
||||
### 追问:那我是否可以设计成不需要点登录按钮的,只要访问页面,它就能登录成功
|
||||
可以:加个过滤器检测到未登录 自动跳转就行了,详细可以参照章节:[[何时引导用户去登录]](/sso/sso-custom-login) 给出的建议进行设计
|
||||
- sso-server 端的单点注销地址:`http://{host}:{port}/sso/signout`;
|
||||
- sso-client 端的注销地址:`http://{host}:{port}/sso/logout`;
|
||||
|
||||
都需要在配置文件配置:`sa-token.sso.is-slo=true`后,才会打开。
|
||||
|
||||
|
||||
### 问:我参照文档搭建SSO-Client,一直提示:Ticket无效,请问怎么回事?
|
||||
@@ -34,6 +35,18 @@ SSO 集成常见问题整理
|
||||
我的建议是:排查时不要仅凭肉眼判断,分别在你的 `Client` 与 `Server` 启动后调用 `SaManager.getSaTokenDao().set("name", "value", 100000);`
|
||||
随便写入一个值,看看能不能根据你的预期写进同一个Redis里,如果能的话才能证明 `Client` 与 `Server` 连接的Reids 是同一个,再进行下一步排查。
|
||||
|
||||
``` java
|
||||
@SpringBootApplication
|
||||
public class SaSsoServerApplication {
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(SaSsoServerApplication.class, args);
|
||||
System.out.println("\n------ Sa-Token-SSO 统一认证中心启动成功 ");
|
||||
// 分别在 Client 与 Server 启动后调用 set 数据代码,看看能否根据预期写入同一个 reids
|
||||
SaManager.getSaTokenDao().set("name", "value", 100000);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
如果使用的是模式三,则排查是否有重复校验 ticket 的代码,一个 ticket 码只能使用一次,多次重复使用就会提示这个。
|
||||
|
||||
|
||||
@@ -44,6 +57,60 @@ SSO 集成常见问题整理
|
||||
解决方案:在 sso-client 也新建上这个类,而且包名需要与 sso-server 端的一致(直接从 sso-server 把实体类复制过来就好了)
|
||||
|
||||
|
||||
|
||||
### 问:SSO模式二或模式三,第一个 client 登录成功之后再访问其它两个 client 不会自动登录,需要点一下登录按钮才会登录上?
|
||||
答:这是正常现象,系统 1 登录成功之后,系统 2 与系统 3 需要点击登录按钮,才会登录成功。
|
||||
|
||||
> 第一个系统,需要:点击 [登录] 按钮 -> 跳转到登录页 -> 输账号密码 -> 登录成功 <br>
|
||||
> 第二个系统,需要:点击 [登录] 按钮 -> 登录成功 <br>
|
||||
> 第三个系统,需要:点击 [登录] 按钮 -> 登录成功
|
||||
>
|
||||
> (系统二、三 免去重复跳转登录页输入账号密码的步骤)
|
||||
|
||||
|
||||
### 追问:那我是否可以设计成不需要点登录按钮的,只要访问页面,它就能登录成功?
|
||||
可以的。
|
||||
|
||||
其实思路很简单,我们只需要给 client 项目加个过滤器,拦截所有请求,只要检测到未登录就将其重定向至登录页面:
|
||||
|
||||
``` java
|
||||
/**
|
||||
* Sa-Token 配置类
|
||||
*/
|
||||
@Configuration
|
||||
public class SaTokenConfigure implements WebMvcConfigurer {
|
||||
/** 注册 [Sa-Token全局过滤器] */
|
||||
@Bean
|
||||
public SaServletFilter getSaServletFilter() {
|
||||
return new SaServletFilter()
|
||||
.addInclude("/**")
|
||||
.addExclude("/sso/*", "/favicon.ico") // 这里需要注意排除掉 /sso/* 相关请求不拦截,否则就会触发无限重定向
|
||||
.setAuth(obj -> {
|
||||
/*
|
||||
* 这里会被分为两种情况:
|
||||
* 情况1:这个请求在当前 client 已经登录,此时会顺利进入网站
|
||||
* 情况2:这个请求在当前 client 尚未登录,此时会被拦截,重定向至当前系统的 /sso/login?back=当前地址
|
||||
*
|
||||
* 情况2会带领着用户继续重定向至 sso-server 认证中心,此时又分为两种情况:
|
||||
* 情况2.1:此用户在 sso-server 尚未登录,此时会停留在登录页面,开始输入账号密码进行登录
|
||||
* 情况2.2:此用户在 sso-server 已经登录(这证明此用户已经在其它至少一个 sso-client 处完成了登录)
|
||||
* 此时用户会继续重定向回当前 client,并携带 ticket 参数,完成登录。
|
||||
*/
|
||||
if(StpUtil.isLogin() == false) {
|
||||
String back = SaFoxUtil.joinParam(SaHolder.getRequest().getUrl(), SpringMVCUtil.getRequest().getQueryString());
|
||||
SaHolder.getResponse().redirect("/sso/login?back=" + SaFoxUtil.encodeUrl(back));
|
||||
SaRouter.back();
|
||||
}
|
||||
})
|
||||
;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
更多登录姿势可以参考 [[何时引导用户去登录]](/sso/sso-custom-login) 给出的建议进行设计。
|
||||
|
||||
|
||||
### 问:如果 sso-client 端我没有集成 sa-token-sso,如何对接?
|
||||
需要手动调用 http 请求来对接 sso-server 开放的接口,参考示例:[sa-token-demo-sso3-client-nosdk](https://gitee.com/dromara/sa-token/tree/master/sa-token-demo/sa-token-demo-sso3-client-nosdk)
|
||||
|
||||
@@ -53,6 +120,10 @@ SSO 集成常见问题整理
|
||||
[SSO-Server 认证中心开放接口](/sso/sso-apidoc)
|
||||
|
||||
|
||||
### 问:将旧有系统改造为单点登录时,应该注意哪些?
|
||||
答:建议不要把其中一个系统改造为SSO服务端,而是新起一个项目作为 SSO-Server 端,所有旧有项目全部作为 Client 端与此对接。
|
||||
|
||||
|
||||
### 问:怎么在一个项目里同时搭建 sso-server 和 sso-client?
|
||||
|
||||
难点在于解决两边的路由冲突,示例代码:
|
||||
@@ -141,7 +212,7 @@ public class SsoUserServerController {
|
||||
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.ok("登录成功!").setData(StpUserUtil.getTokenValue());
|
||||
}
|
||||
return SaResult.error("登录失败!");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user