From 23eda1bfab3a306813fe39a7923d6673c8ef2cd1 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Sun, 25 Sep 2022 00:53:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sa-token-doc/doc/fun/dynamic-router-check.md | 25 ++++++++++++++++++-- sa-token-doc/doc/more/common-questions.md | 8 +++++-- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/sa-token-doc/doc/fun/dynamic-router-check.md b/sa-token-doc/doc/fun/dynamic-router-check.md index abe4d010..2143b52e 100644 --- a/sa-token-doc/doc/fun/dynamic-router-check.md +++ b/sa-token-doc/doc/fun/dynamic-router-check.md @@ -50,8 +50,29 @@ public Map getAuthRules() { ``` - - +--- + +错误的写法: + +``` java +@Override +public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new SaInterceptor(handle -> { + StpUtil.checkLogin(); + })) + .addPathPatterns("/**") + .excludePathPatterns(excludePaths()); +} + +// 动态获取哪些 path 可以忽略鉴权 +public List excludePaths() { + // 此处仅为示例,实际项目你可以写任意代码来查询这些path + return Arrays.asList("/path1", "/path2", "/path3"); +} +``` + +错误点:因为 lambda 表达式之外的代码只会在启动时执行一次,所以 `excludePaths()` 方法是无法做到动态化读取的, +若要在项目运行时动态读写,必须把调用 `excludePaths()` 的时机放在 lambda 里。 diff --git a/sa-token-doc/doc/more/common-questions.md b/sa-token-doc/doc/more/common-questions.md index a4e08f66..2244a3d1 100644 --- a/sa-token-doc/doc/more/common-questions.md +++ b/sa-token-doc/doc/more/common-questions.md @@ -215,6 +215,12 @@ springboot 集成 satoken redis 后, 一旦 springboot 切换版本就有可能 无论什么模型,只要能把一个用户具有的所有权限塞到一个List里返回给框架,就能集成 +### Q:StpInterface 接口的 方法,在什么时候执行? +每次鉴权时执行,例如你调用了 `StpUtil.checkgetPermission("xxx")` 方法,框架就会调用底层的 `StpInterface#getPermissionList` 方法来获取权限数据。 + +如果你的 `getPermissionList` 里有读数据库的代码,那么你每鉴一次权,系统将访问一次数据库。如果要减小性能消耗,可以把权限数据放在缓存中,参考:[把权限放在缓存里](/fun/jur-cache)。 + + ### Q:当我配置不并发登录时,每次登陆都会产生一个新的 Token,旧 Token 依然被保存在 Redis 中,框架为什么不删除呢? 首先,不删除旧 Token 的原因是为了在旧 Token 再次访问系统时提示他:已被顶下线。 @@ -231,10 +237,8 @@ springboot 集成 satoken redis 后, 一旦 springboot 切换版本就有可能 不同版本可能会有所不同,其实在前端摁一下 `F12` 看看哪个 url 报错排除哪个就行了(另附:注解鉴权是不需要排除的,因为 `Swagger` 本身也没有使用 Sa-Token 的注解) - ### Q:SaRouter.match 有多个路径需要排除怎么办? 可以点进去源码看一下,`SaRouter.match`方法有多个重载,可以放一个集合, 例如: - ``` java SaRouter.match("/**").notMatch("/login", "/reg").check(r -> StpUtil.checkLogin()); ```