Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
shengzhang_
sa-token
提交
c57a5cfc
sa-token
项目概览
shengzhang_
/
sa-token
通知
68
Star
16
Fork
4
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
sa-token
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c57a5cfc
编写于
6月 03, 2021
作者:
shengzhang_
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
新增 SaRouter.stop() 函数
上级
4efb0568
变更
18
隐藏空白更改
内联
并排
Showing
18 changed file
with
142 addition
and
71 deletion
+142
-71
README.md
README.md
+5
-5
mvn clean.bat
mvn clean.bat
+4
-0
sa-token-core/src/main/java/cn/dev33/satoken/exception/StopMatchException.java
...n/java/cn/dev33/satoken/exception/StopMatchException.java
+22
-0
sa-token-core/src/main/java/cn/dev33/satoken/router/SaRouter.java
...-core/src/main/java/cn/dev33/satoken/router/SaRouter.java
+11
-1
sa-token-demo/sa-token-demo-solon/src/main/java/com/pj/satoken/SaTokenConfigure.java
...-solon/src/main/java/com/pj/satoken/SaTokenConfigure.java
+1
-1
sa-token-demo/sa-token-demo-springboot/src/main/java/com/pj/satoken/SaTokenConfigure.java
...ngboot/src/main/java/com/pj/satoken/SaTokenConfigure.java
+5
-4
sa-token-demo/sa-token-demo-webflux/src/main/java/com/pj/satoken/SaTokenConfigure.java
...ebflux/src/main/java/com/pj/satoken/SaTokenConfigure.java
+1
-1
sa-token-doc/doc/README.md
sa-token-doc/doc/README.md
+16
-16
sa-token-doc/doc/more/common-questions.md
sa-token-doc/doc/more/common-questions.md
+3
-3
sa-token-doc/doc/start/webflux-example.md
sa-token-doc/doc/start/webflux-example.md
+1
-1
sa-token-doc/doc/use/global-filter.md
sa-token-doc/doc/use/global-filter.md
+1
-1
sa-token-doc/doc/use/route-check.md
sa-token-doc/doc/use/route-check.md
+48
-27
sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaReactorFilter.java
...java/cn/dev33/satoken/reactor/filter/SaReactorFilter.java
+5
-2
sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java
...ugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java
+1
-1
sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/integration/SaTokenPathFilter.java
...cn/dev33/satoken/solon/integration/SaTokenPathFilter.java
+6
-3
sa-token-starter/sa-token-solon-plugin/src/main/resources/META-INF/solon/cn.dev33.satoken.solon.properties
...esources/META-INF/solon/cn.dev33.satoken.solon.properties
+1
-1
sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/filter/SaServletFilter.java
...rc/main/java/cn/dev33/satoken/filter/SaServletFilter.java
+5
-2
sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouteInterceptor.java
...java/cn/dev33/satoken/interceptor/SaRouteInterceptor.java
+6
-2
未找到文件。
README.md
浏览文件 @
c57a5cfc
...
...
@@ -30,9 +30,9 @@
## Sa-Token是什么?
Sa-Token是一个轻量级Java权限认证框架,主要解决:登录认证、权限认证、Session会话、单点登录、OAuth2.0 等一系列权限相关问题
框架针对踢人下线、自动续签、前后台分离、分布式会话……等常见业务进行N多适配,通过
sa-t
oken,你可以以一种极简的方式实现系统的权限认证部分
框架针对踢人下线、自动续签、前后台分离、分布式会话……等常见业务进行N多适配,通过
Sa-T
oken,你可以以一种极简的方式实现系统的权限认证部分
与其它权限认证框架相比,
`
sa-t
oken`
具有以下优势:
与其它权限认证框架相比,
`
Sa-T
oken`
具有以下优势:
1.
**简单**
:可零配置启动框架,真正的开箱即用,低成本上手
2.
**强大**
:目前已集成几十项权限相关特性,涵盖了大部分业务场景的解决方案
3.
**易用**
:如丝般顺滑的API调用,大量高级特性统统只需一行代码即可实现
...
...
@@ -42,8 +42,6 @@ Sa-Token是一个轻量级Java权限认证框架,主要解决:登录认证
## Sa-Token 能做什么?
![
sa-token-js
](
https://oss.dev33.cn/sa-token/doc/sa-token-js.png
's-w'
)
-
**登录验证**
—— 轻松登录鉴权,并提供五种细分场景值
-
**权限验证**
—— 适配RBAC权限模型,不同角色不同授权
-
**Session会话**
—— 专业的数据缓存中心
...
...
@@ -69,6 +67,8 @@ Sa-Token是一个轻量级Java权限认证框架,主要解决:登录认证
-
**开箱即用**
—— 提供SpringMVC、WebFlux等常见web框架starter集成包,真正的开箱即用
-
**更多功能正在集成中...**
—— 如有您有好想法或者建议,欢迎加群交流
![
sa-token-js
](
https://color-test.oss-cn-qingdao.aliyuncs.com/sa-token/sa-token-js.png
's-w'
)
## 代码示例
...
...
@@ -88,7 +88,7 @@ StpUtil.checkLogin();
事实上在此我可以负责的告诉你,在sa-token中,登录授权就是如此的简单,不需要什么全局过滤器,不需要各种乱七八糟的配置!只需要这一行简单的API调用,即可完成会话的登录授权!
当你受够Shiro、Security等框架的三拜九叩之后,你就会明白,相对于这些传统老牌框架,sa-token的API设计是多么的清爽!
当你受够Shiro、S
pring S
ecurity等框架的三拜九叩之后,你就会明白,相对于这些传统老牌框架,sa-token的API设计是多么的清爽!
权限认证示例 (只有具有
`user:add`
权限的会话才可以进入请求)
```
java
...
...
mvn clean.bat
浏览文件 @
c57a5cfc
...
...
@@ -17,6 +17,10 @@ cd sa-token-demo-webflux
call
mvn
clean
cd
..
cd
sa
-token-demo-solon
call
mvn
clean
cd
..
cd
sa
-token-demo-oauth
2
-client
call
mvn
clean
cd
..
...
...
sa-token-core/src/main/java/cn/dev33/satoken/exception/StopMatchException.java
0 → 100644
浏览文件 @
c57a5cfc
package
cn.dev33.satoken.exception
;
/**
* 一个异常:代表停止路由匹配
*
* @author kong
*/
public
class
StopMatchException
extends
SaTokenException
{
/**
* 序列化版本号
*/
private
static
final
long
serialVersionUID
=
6806129545290130143L
;
/**
* 构造
*/
public
StopMatchException
()
{
super
(
"stop match"
);
}
}
sa-token-core/src/main/java/cn/dev33/satoken/router/SaRouter
Util
.java
→
sa-token-core/src/main/java/cn/dev33/satoken/router/SaRouter.java
浏览文件 @
c57a5cfc
...
...
@@ -5,6 +5,7 @@ import java.util.List;
import
cn.dev33.satoken.SaManager
;
import
cn.dev33.satoken.context.SaHolder
;
import
cn.dev33.satoken.exception.StopMatchException
;
import
cn.dev33.satoken.fun.IsRunFunction
;
import
cn.dev33.satoken.fun.SaFunction
;
...
...
@@ -13,7 +14,7 @@ import cn.dev33.satoken.fun.SaFunction;
* @author kong
*
*/
public
class
SaRouter
Util
{
public
class
SaRouter
{
// -------------------- 路由匹配相关 --------------------
...
...
@@ -123,7 +124,16 @@ public class SaRouterUtil {
boolean
matchResult
=
isMatch
(
Arrays
.
asList
(
patterns
),
SaHolder
.
getRequest
().
getRequestPath
());
return
new
IsRunFunction
(
matchResult
);
}
// -------------------- 其它操作 --------------------
/**
* 停止匹配,跳出函数 (在多个匹配链中一次性跳出Auth函数)
*/
public
static
void
stop
()
{
throw
new
StopMatchException
();
}
...
...
sa-token-demo/sa-token-demo-solon/src/main/java/com/pj/satoken/SaTokenConfigure.java
浏览文件 @
c57a5cfc
...
...
@@ -31,7 +31,7 @@ public class SaTokenConfigure {
.
setAuth
(
r
->
{
// System.out.println("---------- sa全局认证");
// SaRouter
Util
.match("/test/test", () -> new Object());
// SaRouter.match("/test/test", () -> new Object());
})
// 异常处理函数:每次认证函数发生异常时执行此函数
...
...
sa-token-demo/sa-token-demo-springboot/src/main/java/com/pj/satoken/SaTokenConfigure.java
浏览文件 @
c57a5cfc
...
...
@@ -37,13 +37,14 @@ public class SaTokenConfigure implements WebMvcConfigurer {
return
new
SaServletFilter
()
// 指定 [拦截路由] 与 [放行路由]
.
addInclude
(
"/**"
).
addExclude
(
"/favicon.ico"
)
.
addInclude
(
"/**"
)
//
.addExclude("/favicon.ico")
// 认证函数: 每次请求执行
.
setAuth
(
r
->
{
// System.out.println("---------- sa全局认证");
// SaRouterUtil.match("/test/test", () -> new Object());
System
.
out
.
println
(
"---------- sa全局认证"
);
System
.
out
.
println
(
SaHolder
.
getRequest
().
getRequestPath
());
// SaRouter.match("/test/test", () -> new Object());
})
// 异常处理函数:每次认证函数发生异常时执行此函数
...
...
sa-token-demo/sa-token-demo-webflux/src/main/java/com/pj/satoken/SaTokenConfigure.java
浏览文件 @
c57a5cfc
...
...
@@ -28,7 +28,7 @@ public class SaTokenConfigure {
// 指定[认证函数]: 每次请求执行
.
setAuth
(
r
->
{
System
.
out
.
println
(
"---------- sa全局认证"
);
// SaRouter
Util
.match("/test/test", () -> StpUtil.checkLogin());
// SaRouter.match("/test/test", () -> StpUtil.checkLogin());
})
// 指定[异常处理函数]:每次[认证函数]发生异常时执行此函数
.
setError
(
e
->
{
...
...
sa-token-doc/doc/README.md
浏览文件 @
c57a5cfc
...
...
@@ -26,23 +26,22 @@
-
[
开源不易,求鼓励,点个star吧 !
](
###
)
## Sa-Token是什么?
Sa-Token是一个轻量级Java权限认证框架,主要解决:登录认证、权限认证、Session会话、单点登录、OAuth2.0 等一系列权限相关问题
框架针对踢人下线、自动续签、前后台分离、分布式会话……等常见业务进行N多适配,通过
sa-t
oken,你可以以一种极简的方式实现系统的权限认证部分
框架针对踢人下线、自动续签、前后台分离、分布式会话……等常见业务进行N多适配,通过
Sa-T
oken,你可以以一种极简的方式实现系统的权限认证部分
与其它权限认证框架相比,
`
sa-t
oken`
具有以下优势:
与其它权限认证框架相比,
`
Sa-T
oken`
具有以下优势:
1.
**简单**
:可零配置启动框架,真正的开箱即用,低成本上手
2.
**强大**
:目前已集成几十项权限相关特性,涵盖了大部分业务场景的解决方案
3.
**易用**
:如丝般顺滑的API调用,大量高级特性统统只需一行代码即可实现
4.
**高扩展**
:几乎所有组件都提供了扩展接口,90%以上的逻辑都可以按需重写
有了
sa-t
oken,你所有的权限认证问题,都不再是问题!
有了
Sa-T
oken,你所有的权限认证问题,都不再是问题!
## Sa-Token 能做什么?
![
sa-token-js
](
https://oss.dev33.cn/sa-token/doc/sa-token-js.png
's-w'
)
-
**登录验证**
—— 轻松登录鉴权,并提供五种细分场景值
-
**权限验证**
—— 适配RBAC权限模型,不同角色不同授权
-
**Session会话**
—— 专业的数据缓存中心
...
...
@@ -68,10 +67,12 @@ Sa-Token是一个轻量级Java权限认证框架,主要解决:登录认证
-
**开箱即用**
—— 提供SpringMVC、WebFlux等常见web框架starter集成包,真正的开箱即用
-
**更多功能正在集成中...**
—— 如有您有好想法或者建议,欢迎加群交流
![
sa-token-js
](
https://color-test.oss-cn-qingdao.aliyuncs.com/sa-token/sa-token-js.png
's-w'
)
## 代码示例
sa-t
oken的API调用非常简单,有多简单呢?以登录验证为例,你只需要:
Sa-T
oken的API调用非常简单,有多简单呢?以登录验证为例,你只需要:
```
java
// 在登录时写入当前会话的账号id
...
...
@@ -81,16 +82,15 @@ StpUtil.setLoginId(10001);
// 如果当前会话未登录,这句代码会抛出 `NotLoginException`异常
StpUtil
.
checkLogin
();
```
至此,我们已经借助
sa-t
oken框架完成登录授权!
至此,我们已经借助
Sa-T
oken框架完成登录授权!
此时的你小脑袋可能飘满了问号,就这么简单?自定义Realm呢?全局过滤器呢?我不用写各种配置文件吗?
事实上在此我可以负责的告诉你,在
sa-t
oken中,登录授权就是如此的简单,不需要什么全局过滤器,不需要各种乱七八糟的配置!只需要这一行简单的API调用,即可完成会话的登录授权!
事实上在此我可以负责的告诉你,在
Sa-T
oken中,登录授权就是如此的简单,不需要什么全局过滤器,不需要各种乱七八糟的配置!只需要这一行简单的API调用,即可完成会话的登录授权!
当你受够Shiro、S
ecurity等框架的三拜九叩之后,你就会明白,相对于这些传统老牌框架,sa-t
oken的API设计是多么的清爽!
当你受够Shiro、S
pring Security等框架的三拜九叩之后,你就会明白,相对于这些传统老牌框架,Sa-T
oken的API设计是多么的清爽!
权限认证示例 (只有具有
`user:add`
权限的会话才可以进入请求)
```
java
@SaCheckPermission
(
"user:add"
)
@RequestMapping
(
"/user/insert"
)
...
...
@@ -106,7 +106,7 @@ public String insert(SysUser user) {
StpUtil
.
logoutByLoginId
(
10001
);
```
除了以上的示例,
sa-t
oken还可以一行代码完成以下功能:
除了以上的示例,
Sa-T
oken还可以一行代码完成以下功能:
```
java
StpUtil
.
setLoginId
(
10001
);
// 标记当前会话登录的账号id
StpUtil
.
getLoginId
();
// 获取当前会话登录的账号id
...
...
@@ -122,7 +122,7 @@ StpUtil.setLoginId(10001, "PC"); // 指定设备标识登录
StpUtil
.
logoutByLoginId
(
10001
,
"PC"
);
// 指定设备标识进行强制注销 (不同端不受影响)
StpUtil
.
switchTo
(
10044
);
// 将当前会话身份临时切换为其它账号
```
sa-t
oken API 众多,请恕此处无法为您逐一展示,更多示例请戳官方在线文档
Sa-T
oken API 众多,请恕此处无法为您逐一展示,更多示例请戳官方在线文档
## Star 趋势
...
...
@@ -133,7 +133,7 @@ sa-token API 众多,请恕此处无法为您逐一展示,更多示例请戳
## 参与贡献
众人拾柴火焰高,万丈高楼众人起!
sa-t
oken秉承着开放的思想,欢迎大家为框架添砖加瓦:
Sa-T
oken秉承着开放的思想,欢迎大家为框架添砖加瓦:
1.
核心代码:该部分需要开发者了解整个框架的架构,遵循已有代码规范进行bug修复或提交新功能
2.
文档部分:需要以清晰明了的语句书写文档,力求简单易读,授人以鱼同时更授人以渔
...
...
@@ -142,17 +142,17 @@ sa-token秉承着开放的思想,欢迎大家为框架添砖加瓦:
5.
其它部分:您可以参考项目issues与需求墙进行贡献
作者寄语:参与贡献不光只有提交代码,点一个star、提一个issues都是对开源项目的促进,
如果
sa-token帮助到了你,欢迎你把框架推荐给朋友、同事使用,为sa-t
oken的推广做一份贡献
如果
Sa-Token帮助到了你,欢迎你把框架推荐给朋友、同事使用,为Sa-T
oken的推广做一份贡献
## 使用
sa-t
oken的开源项目
## 使用
Sa-T
oken的开源项目
[
**[ sa-plus]** 一个基于springboot架构的快速开发框架,内置代码生成器
](
https://gitee.com/click33/sa-plus
)
[
**[ jthink]** 一个基于springboot+sa-token+thymeleaf的博客系统
](
https://gitee.com/wtsoftware/jthink
)
[
**[ dcy-fast]** 一个基于springboot+sa-token+mybatis-plus的后台管理系统,前端vue-element-admin,并且内置代码生成器
](
https://gitee.com/dcy421/dcy-fast
)
如果您的项目使用了
sa-t
oken,欢迎提交pr
如果您的项目使用了
Sa-T
oken,欢迎提交pr
## 友情链接
...
...
sa-token-doc/doc/more/common-questions.md
浏览文件 @
c57a5cfc
...
...
@@ -28,9 +28,9 @@
无论什么模型,只要能把一个用户具有的所有权限塞到一个List里返回给框架,就能集成
### SaRouter
Util
.match 有多个路径需要排除怎么办?
可以点进去源码看一下,
`SaRouter
Util
.match`
方法有多个重载,可以放一个集合, 例如:
<br>
`SaRouter
Util
.match(Arrays.asList("/**"), Arrays.asList("/login", "/reg"), () -> StpUtil.checkLogin());`
### SaRouter.match 有多个路径需要排除怎么办?
可以点进去源码看一下,
`SaRouter.match`
方法有多个重载,可以放一个集合, 例如:
<br>
`SaRouter.match(Arrays.asList("/**"), Arrays.asList("/login", "/reg"), () -> StpUtil.checkLogin());`
### 为什么StpUtil.setLoginId() 不能直接写入一个User对象?
...
...
sa-token-doc/doc/start/webflux-example.md
浏览文件 @
c57a5cfc
...
...
@@ -58,7 +58,7 @@ public class SaTokenConfigure {
// 指定[认证函数]: 每次请求执行
.
setAuth
(
r
->
{
System
.
out
.
println
(
"---------- sa全局认证"
);
// SaRouter
Util
.match("/test/test", () -> StpUtil.checkLogin());
// SaRouter.match("/test/test", () -> StpUtil.checkLogin());
})
// 指定[异常处理函数]:每次[认证函数]发生异常时执行此函数
.
setError
(
e
->
{
...
...
sa-token-doc/doc/use/global-filter.md
浏览文件 @
c57a5cfc
...
...
@@ -43,7 +43,7 @@ public class SaTokenConfigure {
System
.
out
.
println
(
"---------- 进入sa-token全局认证 -----------"
);
// 登录验证 -- 拦截所有路由,并排除/user/doLogin 用于开放登录
SaRouter
Util
.
match
(
"/**"
,
"/user/doLogin"
,
()
->
StpUtil
.
checkLogin
());
SaRouter
.
match
(
"/**"
,
"/user/doLogin"
,
()
->
StpUtil
.
checkLogin
());
// 更多拦截处理方式,请参考“路由拦截式鉴权”章节
})
...
...
sa-token-doc/doc/use/route-check.md
浏览文件 @
c57a5cfc
...
...
@@ -9,7 +9,7 @@
## 1、注册路由拦截器
##
#
1、注册路由拦截器
以
`SpringBoot2.0`
为例, 新建配置类
`SaTokenConfigure.java`
```
java
@Configuration
...
...
@@ -26,7 +26,7 @@ public class SaTokenConfigure implements WebMvcConfigurer {
那么我们如何进行权限认证拦截呢,且往下看
## 2、自定义权限验证规则
##
#
2、自定义权限验证规则
你可以使用函数式编程自定义验证规则
```
java
...
...
@@ -35,20 +35,20 @@ public class SaTokenConfigure implements WebMvcConfigurer {
@Override
public
void
addInterceptors
(
InterceptorRegistry
registry
)
{
// 注册路由拦截器,自定义验证规则
registry
.
addInterceptor
(
new
SaRouteInterceptor
((
req
uest
,
response
,
handler
)->{
registry
.
addInterceptor
(
new
SaRouteInterceptor
((
req
,
res
,
handler
)->{
// 根据路由划分模块,不同模块不同鉴权
SaRouter
Util
.
match
(
"/user/**"
,
()
->
StpUtil
.
checkPermission
(
"user"
));
SaRouter
Util
.
match
(
"/admin/**"
,
()
->
StpUtil
.
checkPermission
(
"admin"
));
SaRouter
Util
.
match
(
"/goods/**"
,
()
->
StpUtil
.
checkPermission
(
"goods"
));
SaRouter
Util
.
match
(
"/orders/**"
,
()
->
StpUtil
.
checkPermission
(
"orders"
));
SaRouter
Util
.
match
(
"/notice/**"
,
()
->
StpUtil
.
checkPermission
(
"notice"
));
SaRouter
Util
.
match
(
"/comment/**"
,
()
->
StpUtil
.
checkPermission
(
"comment"
));
SaRouter
.
match
(
"/user/**"
,
()
->
StpUtil
.
checkPermission
(
"user"
));
SaRouter
.
match
(
"/admin/**"
,
()
->
StpUtil
.
checkPermission
(
"admin"
));
SaRouter
.
match
(
"/goods/**"
,
()
->
StpUtil
.
checkPermission
(
"goods"
));
SaRouter
.
match
(
"/orders/**"
,
()
->
StpUtil
.
checkPermission
(
"orders"
));
SaRouter
.
match
(
"/notice/**"
,
()
->
StpUtil
.
checkPermission
(
"notice"
));
SaRouter
.
match
(
"/comment/**"
,
()
->
StpUtil
.
checkPermission
(
"comment"
));
})).
addPathPatterns
(
"/**"
);
}
}
```
## 3、完整示例
##
#
3、完整示例
所有用法示例:
```
java
...
...
@@ -58,37 +58,41 @@ public class SaTokenConfigure implements WebMvcConfigurer {
@Override
public
void
addInterceptors
(
InterceptorRegistry
registry
)
{
// 注册路由拦截器,自定义验证规则
registry
.
addInterceptor
(
new
SaRouteInterceptor
((
req
uest
,
response
,
handler
)
->
{
registry
.
addInterceptor
(
new
SaRouteInterceptor
((
req
,
res
,
handler
)
->
{
// 登录验证 -- 拦截所有路由,并排除/user/doLogin 用于开放登录
SaRouter
Util
.
match
(
"/**"
,
"/user/doLogin"
,
()
->
StpUtil
.
checkLogin
());
SaRouter
.
match
(
"/**"
,
"/user/doLogin"
,
()
->
StpUtil
.
checkLogin
());
// 登录验证 -- 排除多个路径
SaRouter
Util
.
match
(
Arrays
.
asList
(
"/**"
),
Arrays
.
asList
(
"/user/doLogin"
,
"/user/reg"
),
()
->
StpUtil
.
checkLogin
());
SaRouter
.
match
(
Arrays
.
asList
(
"/**"
),
Arrays
.
asList
(
"/user/doLogin"
,
"/user/reg"
),
()
->
StpUtil
.
checkLogin
());
// 角色认证 -- 拦截以 admin 开头的路由,必须具备[admin]角色或者[super-admin]角色才可以通过认证
SaRouter
Util
.
match
(
"/admin/**"
,
()
->
StpUtil
.
checkRoleOr
(
"admin"
,
"super-admin"
));
SaRouter
.
match
(
"/admin/**"
,
()
->
StpUtil
.
checkRoleOr
(
"admin"
,
"super-admin"
));
// 权限认证 -- 不同模块, 校验不同权限
SaRouter
Util
.
match
(
"/user/**"
,
()
->
StpUtil
.
checkPermission
(
"user"
));
SaRouter
Util
.
match
(
"/admin/**"
,
()
->
StpUtil
.
checkPermission
(
"admin"
));
SaRouter
Util
.
match
(
"/goods/**"
,
()
->
StpUtil
.
checkPermission
(
"goods"
));
SaRouter
Util
.
match
(
"/orders/**"
,
()
->
StpUtil
.
checkPermission
(
"orders"
));
SaRouter
Util
.
match
(
"/notice/**"
,
()
->
StpUtil
.
checkPermission
(
"notice"
));
SaRouter
Util
.
match
(
"/comment/**"
,
()
->
StpUtil
.
checkPermission
(
"comment"
));
SaRouter
.
match
(
"/user/**"
,
()
->
StpUtil
.
checkPermission
(
"user"
));
SaRouter
.
match
(
"/admin/**"
,
()
->
StpUtil
.
checkPermission
(
"admin"
));
SaRouter
.
match
(
"/goods/**"
,
()
->
StpUtil
.
checkPermission
(
"goods"
));
SaRouter
.
match
(
"/orders/**"
,
()
->
StpUtil
.
checkPermission
(
"orders"
));
SaRouter
.
match
(
"/notice/**"
,
()
->
StpUtil
.
checkPermission
(
"notice"
));
SaRouter
.
match
(
"/comment/**"
,
()
->
StpUtil
.
checkPermission
(
"comment"
));
// 匹配 restful 风格路由
SaRouter
Util
.
match
(
"/article/get/{id}"
,
()
->
StpUtil
.
checkPermission
(
"article"
));
SaRouter
.
match
(
"/article/get/{id}"
,
()
->
StpUtil
.
checkPermission
(
"article"
));
// 检查请求方式
SaRouter
Util
.
match
(
"/notice/**"
,
()
->
{
if
(
req
uest
.
getMethod
().
equals
(
HttpMethod
.
GET
.
toString
()))
{
SaRouter
.
match
(
"/notice/**"
,
()
->
{
if
(
req
.
getMethod
().
equals
(
HttpMethod
.
GET
.
toString
()))
{
StpUtil
.
checkPermission
(
"notice"
);
}
});
// 提前退出
// 在多账号模式下,可以使用任意StpUtil进行校验
SaRouter
Util
.
match
(
"/user/**"
,
()
->
StpUserUtil
.
checkLogin
());
SaRouter
.
match
(
"/user/**"
,
()
->
StpUserUtil
.
checkLogin
());
})).
addPathPatterns
(
"/**"
);
}
...
...
@@ -96,10 +100,27 @@ public class SaTokenConfigure implements WebMvcConfigurer {
```
### 4、提前退出匹配链条
使用
`SaRouter.stop()`
可以提前退出匹配链,例:
```
java
// 原写法
registry
.
addInterceptor
(
SaRouteInterceptor
.
createPermissionVal
(
"user"
)).
addPathPatterns
(
"/user/**"
);
// 改为以下方式,效果同上
registry
.
addInterceptor
(
new
SaRouteInterceptor
((
req
,
res
,
handler
)
->
{
SaRouter
.
match
(
"/**"
,
()
->
System
.
out
.
println
(
"进入1"
));
SaRouter
.
match
(
"/**"
,
()
->
{
System
.
out
.
println
(
"进入2"
);
SaRouter
.
stop
();});
SaRouter
.
match
(
"/**"
,
()
->
System
.
out
.
println
(
"进入3"
));
})).
addPathPatterns
(
"/**"
);
```
如上示例,代码运行至第2条匹配链时,会在stop函数处提前退出整个匹配函数,从而忽略掉剩余的所有match匹配
## 注意事项
<!--
### 注意事项
在
`v1.14`
及以前版本下,路由拦截器提供了封装式写法,该方法代码比较冗余,在
`v1.15`
版本已移除,替代方案如下:
```
java
...
...
@@ -108,9 +129,9 @@ registry.addInterceptor(SaRouteInterceptor.createPermissionVal("user")).addPathP
// 改为以下方式,效果同上
registry
.
addInterceptor
(
new
SaRouteInterceptor
((
request
,
response
,
handler
)
->
{
SaRouter
Util
.
match
(
"/user/**"
,
()
->
StpUtil
.
checkPermission
(
"user"
));
SaRouter
.
match
(
"/user/**"
,
()
->
StpUtil
.
checkPermission
(
"user"
));
})).
addPathPatterns
(
"/**"
);
```
-->
\ No newline at end of file
sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/filter/SaReactorFilter.java
浏览文件 @
c57a5cfc
...
...
@@ -10,11 +10,12 @@ import org.springframework.web.server.WebFilter;
import
org.springframework.web.server.WebFilterChain
;
import
cn.dev33.satoken.exception.SaTokenException
;
import
cn.dev33.satoken.exception.StopMatchException
;
import
cn.dev33.satoken.filter.SaFilterAuthStrategy
;
import
cn.dev33.satoken.filter.SaFilterErrorStrategy
;
import
cn.dev33.satoken.reactor.context.SaReactorHolder
;
import
cn.dev33.satoken.reactor.context.SaReactorSyncHolder
;
import
cn.dev33.satoken.router.SaRouter
Util
;
import
cn.dev33.satoken.router.SaRouter
;
import
cn.dev33.satoken.util.SaTokenConsts
;
import
reactor.core.publisher.Mono
;
...
...
@@ -155,11 +156,13 @@ public class SaReactorFilter implements WebFilter {
SaReactorSyncHolder
.
setContent
(
exchange
);
// 执行全局过滤器
SaRouter
Util
.
match
(
includeList
,
excludeList
,
()
->
{
SaRouter
.
match
(
includeList
,
excludeList
,
()
->
{
beforeAuth
.
run
(
null
);
auth
.
run
(
null
);
});
}
catch
(
StopMatchException
e
)
{
}
catch
(
Throwable
e
)
{
// 1. 获取异常处理策略结果
Object
result
=
error
.
run
(
e
);
...
...
sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/
SolonPluginImpl
.java
→
sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/
XPluginImp
.java
浏览文件 @
c57a5cfc
...
...
@@ -21,7 +21,7 @@ import cn.dev33.satoken.stp.StpInterface;
* @author noear
* @since 1.4
*/
public
class
SolonPluginImpl
implements
Plugin
{
public
class
XPluginImp
implements
Plugin
{
@Override
public
void
start
(
SolonApp
app
)
{
...
...
sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/integration/SaTokenPathFilter.java
浏览文件 @
c57a5cfc
...
...
@@ -2,9 +2,10 @@ package cn.dev33.satoken.solon.integration;
import
cn.dev33.satoken.exception.SaTokenException
;
import
cn.dev33.satoken.exception.StopMatchException
;
import
cn.dev33.satoken.filter.SaFilterAuthStrategy
;
import
cn.dev33.satoken.filter.SaFilterErrorStrategy
;
import
cn.dev33.satoken.router.SaRouter
Util
;
import
cn.dev33.satoken.router.SaRouter
;
import
org.noear.solon.core.handle.Context
;
import
org.noear.solon.core.handle.Filter
;
import
org.noear.solon.core.handle.FilterChain
;
...
...
@@ -141,12 +142,14 @@ public class SaTokenPathFilter implements Filter {
public
void
doFilter
(
Context
ctx
,
FilterChain
chain
)
throws
Throwable
{
try
{
// 执行全局过滤器
SaRouter
Util
.
match
(
includeList
,
excludeList
,
()
->
{
SaRouter
.
match
(
includeList
,
excludeList
,
()
->
{
beforeAuth
.
run
(
null
);
auth
.
run
(
null
);
});
}
catch
(
Throwable
e
)
{
}
catch
(
StopMatchException
e
)
{
}
catch
(
Throwable
e
)
{
// 1. 获取异常处理策略结果
Object
result
=
error
.
run
(
e
);
String
resultString
=
String
.
valueOf
(
result
);
...
...
sa-token-starter/sa-token-solon-plugin/src/main/resources/META-INF/solon/cn.dev33.satoken.solon.properties
浏览文件 @
c57a5cfc
solon.plugin
=
cn.dev33.satoken.solon.SolonPluginImpl
\ No newline at end of file
solon.plugin
=
cn.dev33.satoken.solon.XPluginImp
\ No newline at end of file
sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/filter/SaServletFilter.java
浏览文件 @
c57a5cfc
...
...
@@ -15,7 +15,8 @@ import javax.servlet.ServletResponse;
import
org.springframework.core.annotation.Order
;
import
cn.dev33.satoken.exception.SaTokenException
;
import
cn.dev33.satoken.router.SaRouterUtil
;
import
cn.dev33.satoken.exception.StopMatchException
;
import
cn.dev33.satoken.router.SaRouter
;
import
cn.dev33.satoken.util.SaTokenConsts
;
/**
...
...
@@ -153,11 +154,13 @@ public class SaServletFilter implements Filter {
try
{
// 执行全局过滤器
SaRouter
Util
.
match
(
includeList
,
excludeList
,
()
->
{
SaRouter
.
match
(
includeList
,
excludeList
,
()
->
{
beforeAuth
.
run
(
null
);
auth
.
run
(
null
);
});
}
catch
(
StopMatchException
e
)
{
}
catch
(
Throwable
e
)
{
// 1. 获取异常处理策略结果
Object
result
=
error
.
run
(
e
);
...
...
sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouteInterceptor.java
浏览文件 @
c57a5cfc
...
...
@@ -5,6 +5,7 @@ import javax.servlet.http.HttpServletResponse;
import
org.springframework.web.servlet.HandlerInterceptor
;
import
cn.dev33.satoken.exception.StopMatchException
;
import
cn.dev33.satoken.router.SaRouteFunction
;
import
cn.dev33.satoken.servlet.model.SaRequestForServlet
;
import
cn.dev33.satoken.servlet.model.SaResponseForServlet
;
...
...
@@ -58,8 +59,11 @@ public class SaRouteInterceptor implements HandlerInterceptor {
if
(
function
==
null
)
{
StpUtil
.
checkLogin
();
}
else
{
// 否则执行函数
function
.
run
(
new
SaRequestForServlet
(
request
),
new
SaResponseForServlet
(
response
),
handler
);
// 否则执行认证函数
try
{
function
.
run
(
new
SaRequestForServlet
(
request
),
new
SaResponseForServlet
(
response
),
handler
);
}
catch
(
StopMatchException
e
)
{
}
}
// 通过验证
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录