From e5dc9165d1010395349f3bb831cdd72c0e6ea3a0 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Fri, 28 Oct 2022 18:09:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=B8=B8=E8=A7=81=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E6=8E=92=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- sa-token-doc/README.md | 2 +- sa-token-doc/more/common-questions.md | 70 ++++++++++++++++++++++++++- sa-token-doc/more/join-group.md | 5 +- 4 files changed, 72 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 9d1626cb..2f68224c 100644 --- a/README.md +++ b/README.md @@ -184,7 +184,7 @@ Sa-OAuth2 模块分为四种授权模式,解决不同场景下的授权需求 ## 交流群 -QQ交流群:614714762 [点击加入](https://jq.qq.com/?_wv=1027&k=F96A2mrl) +QQ交流群:707350988 [点击加入](https://jq.qq.com/?_wv=1027&k=tqbzHT2D) 微信交流群: diff --git a/sa-token-doc/README.md b/sa-token-doc/README.md index 771e7400..c0667314 100644 --- a/sa-token-doc/README.md +++ b/sa-token-doc/README.md @@ -136,7 +136,7 @@ Sa-Token 目前主要五大功能模块:登录认证、权限认证、单点 ## 交流群 -QQ交流群:614714762 [点击加入](https://jq.qq.com/?_wv=1027&k=F96A2mrl) +QQ交流群:707350988 [点击加入](https://jq.qq.com/?_wv=1027&k=tqbzHT2D) 微信交流群: diff --git a/sa-token-doc/more/common-questions.md b/sa-token-doc/more/common-questions.md index 7be53701..453b5d84 100644 --- a/sa-token-doc/more/common-questions.md +++ b/sa-token-doc/more/common-questions.md @@ -135,15 +135,49 @@ public class SaTokenConfigure implements WebMvcConfigurer { - 可能2:你访问的接口可能是404了,SpringBoot环境下如果访问接口404后,会被转发到`/error`,然后被再次拦截。请确保你访问的 path 有对应的 Controller 承接! - 可能3:可能这里并没有拦截,但是又被其他地方拦截了。请先把这个拦截器给注释掉,看看还会不会拦截,如果依然拦截,那说明不是这个拦截器的锅,请仔细查看一下控制台抛出的堆栈信息,定位一下到底是哪行代码拦截住这个请求的。 - 可能4:后端拦截的 path 未必是你前端访问的这个path,建议先打印一下 path 信息,看看和你预想的是否一致,再做分析。 -- 可能5:你写了多个匹配规则,请求只越过了第一个规则,被其它规则拦下了,例如以下代码: ``` java +// 打印一下,看看后端接受到的path,是否和你前端访问时的一致,如果不一致,先找找原因为啥不一致 +registry.addInterceptor(new SaInterceptor(handler -> { + System.out.println("前端访问的 path 是:" + SaHolder.getRequest().getRequestPath()); + StpUtil.checkLogin(); +})).addPathPatterns("/**"); +``` +- 可能5:你的项目配置了 `context-path` 上下文地址,比如 `server.servlet.context-path=/shop`,注意这个地址是不需要加在拦截器上的: +``` java +// 这是错误示例,不需要把 context-path 上下文参数写在下面的 excludePathPatterns 地址上。 +registry.addInterceptor(new SaInterceptor(hadnle -> StpUtil.checkLogin())) + .addPathPatterns("/**").excludePathPatterns("/shop/user/login"); +// 这是正确示例,无论你的 context-path 上下文配置了什么样的值,下面的 excludePathPatterns 地址都不需要写上它 +registry.addInterceptor(new SaInterceptor(hadnle -> StpUtil.checkLogin())) + .addPathPatterns("/**").excludePathPatterns("/user/login"); +``` +- 可能6:你写了多个匹配规则,请求只越过了第一个规则,被其它规则拦下了,例如以下代码: +``` java +// 以下代码,当你未登录访问 `/user/doLogin` 时,会被第1条规则越过,然后被第2条拦下,校验登录,然后抛出异常:`NotLoginException:xxx` registry.addInterceptor(new SaInterceptor(handler -> { SaRouter.match("/**").notMatch("/user/doLogin").check(r -> StpUtil.checkLogin()); // 第1个规则 SaRouter.match("/**").notMatch("/article/getList").check(r -> StpUtil.checkLogin()); // 第2个规则 SaRouter.match("/**").notMatch("/goods/getList").check(r -> StpUtil.checkLogin()); // 第3个规则 })).addPathPatterns("/**"); ``` -以上代码,当你未登录访问 `/user/doLogin` 时,会被第1条规则越过,然后被第2条拦下,校验登录,然后抛出异常:`NotLoginException:xxx` +- 可能7:你自定义的封装方法,并没有按照你的预想情况执行: +``` java +public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new SaInterceptor(handle -> { + // 调用自定义的 excludePaths() 方法获取数据排除鉴权 + SaRouter.match("/**").notMatch(excludePaths()).check(r -> StpUtil.checkLogin()); + })).addPathPatterns("/**"); +} +// 自定义查询排查鉴权的地址方法 +public static List excludePaths() { + List list = ... // 从数据源查询...; + return list; +} +``` +如上方法, `excludePaths()` 可能并不会像你预想的一样正确执行返回相应的值,请在 `.notMatch()` 处 `一律先硬编码写固定死值来测试`,这时就有两种情况: + - 情况1:写固定死值时,代码能正常执行了,那说明你自定义的 `excludePaths()` 方法有问题,执行结果不正确。 + - 情况2:写固定也不行,那说明不是 `excludePaths()` 的问题,那再从其它地方开始排查。 + ### Q:我在配置文件中加了一些关于 Sa-Token 的配置,但是没有生效。 @@ -276,6 +310,38 @@ springboot 集成 satoken redis 后, 一旦 springboot 切换版本就有可能 +### Q:我实现了 StpInterface 接口,但是在登录时没有进入我的实现类代码? +不进入是正常现象, StpInterface 是鉴权接口,在执行鉴权代码时才会进入 StpInterface 实现类,登录认证时不会进入。 + + +### Q:启动时报错,找不到 xx 类 xx 方法: +``` java +Caused by: java.lang.ClassNotFoundException: cn.dev33.satoken.same.SaSameTemplate +``` + +一般找不到类,或者找不到方法,都是版本冲突了,使用 Sa-Token 时一定要注意**版本对齐**,意思是所有和 Sa-Token 相关的依赖都需要版本一致。 + +比如说你如果一个依赖是 1.32.0,一个是 1.31.0,就会造成无法启动: + +``` xml + + + cn.dev33 + sa-token-spring-boot-starter + 1.32.0 + + + cn.dev33 + sa-token-core + 1.31.0 + +``` + +请仔细排查你的 pom.xml 文件,是否有 Sa-Token 依赖没对齐,**请不要肉眼检查,用全局搜索 "sa-token" 关键词来找**,如果是多模块或者微服务项目,就整个项目搜索。 + + + + diff --git a/sa-token-doc/more/join-group.md b/sa-token-doc/more/join-group.md index 65715b6b..4500eaa7 100644 --- a/sa-token-doc/more/join-group.md +++ b/sa-token-doc/more/join-group.md @@ -6,10 +6,9 @@ ### 1、加入QQ交流群 +![QQ群](https://oss.dev33.cn/sa-token/qq-group-4.png ':size=180') -![QQ群](https://oss.dev33.cn/sa-token/qq-group-2.png ':size=180') - -QQ交流群:614714762 [点击加入](https://jq.qq.com/?_wv=1027&k=F96A2mrl) +QQ交流群:707350988 [点击加入](https://jq.qq.com/?_wv=1027&k=tqbzHT2D) ### 2、加入微信交流群: