diff --git a/README.md b/README.md
index 475de5827badef1695eba69d9479b4ddb122db7c..aafa84a29d57296a1eae496e00dcbad82b091a24 100644
--- a/README.md
+++ b/README.md
@@ -41,6 +41,9 @@ sa-token是一个轻量级Java权限认证框架,主要解决:登录认证
有了sa-token,你所有的权限认证问题,都不再是问题!
## Sa-Token 能做什么?
+
+![sa-token-js](https://oss.dev33.cn/sa-token/doc/sa-token-js.png)
+
- **登录验证** —— 轻松登录鉴权,并提供五种细分场景值
- **权限验证** —— 适配RBAC权限模型,不同角色不同授权
- **Session会话** —— 专业的数据缓存中心
@@ -122,7 +125,7 @@ sa-token API 众多,请恕此处无法为您逐一展示,更多示例请戳
## Star 趋势
-[![Giteye chart](https://chart.giteye.net/gitee/dromara/sa-token/77YQZ6UK.png 'Gitee')](https://giteye.net/chart/77YQZ6UK)
+[![giteye-chart](https://chart.giteye.net/gitee/dromara/sa-token/77YQZ6UK.png 'Gitee')](https://giteye.net/chart/77YQZ6UK)
[![github-chart](https://starchart.cc/dromara/sa-token.svg 'GitHub')](https://starchart.cc/dromara/sa-token)
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/SaTokenManager.java b/sa-token-core/src/main/java/cn/dev33/satoken/SaTokenManager.java
index 2c56c70b2b8d00db100688030fad3132da87de34..9671b25319e888c95d95f35ca244d4a7cebac7c7 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/SaTokenManager.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/SaTokenManager.java
@@ -5,14 +5,14 @@ import java.util.Map;
import cn.dev33.satoken.action.SaTokenAction;
import cn.dev33.satoken.action.SaTokenActionDefaultImpl;
-import cn.dev33.satoken.aop.SaTokenListener;
-import cn.dev33.satoken.aop.SaTokenListenerDefaultImpl;
import cn.dev33.satoken.config.SaTokenConfig;
import cn.dev33.satoken.config.SaTokenConfigFactory;
import cn.dev33.satoken.context.SaTokenContext;
import cn.dev33.satoken.context.SaTokenContextDefaultImpl;
import cn.dev33.satoken.dao.SaTokenDao;
import cn.dev33.satoken.dao.SaTokenDaoDefaultImpl;
+import cn.dev33.satoken.listener.SaTokenListener;
+import cn.dev33.satoken.listener.SaTokenListenerDefaultImpl;
import cn.dev33.satoken.stp.StpInterface;
import cn.dev33.satoken.stp.StpInterfaceDefaultImpl;
import cn.dev33.satoken.stp.StpLogic;
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/aop/SaTokenListener.java b/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListener.java
similarity index 98%
rename from sa-token-core/src/main/java/cn/dev33/satoken/aop/SaTokenListener.java
rename to sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListener.java
index d44102159619a7b7597bc98dd252eb78236c9411..e1e18061f8df62b3374686347123f59c3a1de169 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/aop/SaTokenListener.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListener.java
@@ -1,4 +1,4 @@
-package cn.dev33.satoken.aop;
+package cn.dev33.satoken.listener;
import cn.dev33.satoken.stp.SaLoginModel;
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/aop/SaTokenListenerDefaultImpl.java b/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerDefaultImpl.java
similarity index 98%
rename from sa-token-core/src/main/java/cn/dev33/satoken/aop/SaTokenListenerDefaultImpl.java
rename to sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerDefaultImpl.java
index 7f9f408b4a7109bac78bd85a2ef26e4702b50db5..378c642716a05f5a7c10b8f8570a26eb70265417 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/aop/SaTokenListenerDefaultImpl.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerDefaultImpl.java
@@ -1,4 +1,4 @@
-package cn.dev33.satoken.aop;
+package cn.dev33.satoken.listener;
import java.util.Date;
diff --git a/sa-token-demo-springboot/src/main/java/com/pj/test/UserController.java b/sa-token-demo-springboot/src/main/java/com/pj/test/UserController.java
index 43d9558f053020cdf5ded3412889c11baf695362..ca4e31380883c77ed113fd8cfe6519f0ac9ef77a 100644
--- a/sa-token-demo-springboot/src/main/java/com/pj/test/UserController.java
+++ b/sa-token-demo-springboot/src/main/java/com/pj/test/UserController.java
@@ -5,18 +5,30 @@ import org.springframework.web.bind.annotation.RestController;
import cn.dev33.satoken.stp.StpUtil;
+/**
+ * 登录测试
+ * @author kong
+ *
+ */
@RestController
-@RequestMapping("user")
+@RequestMapping("/user/")
public class UserController {
- // 测试 浏览器访问: http://localhost:8081/user/doLogin
+ // 测试登录,浏览器访问: http://localhost:8081/user/doLogin?username=zhang&password=123456
@RequestMapping("doLogin")
- public String test(String username, String password) {
+ public String doLogin(String username, String password) {
+ // 此处仅作模拟示例,真实项目需要从数据库中查询数据进行比对
if("zhang".equals(username) && "123456".equals(password)) {
StpUtil.setLoginId(10001);
return "登录成功";
}
return "登录失败";
}
+
+ // 查询登录状态,浏览器访问: http://localhost:8081/user/isLogin
+ @RequestMapping("isLogin")
+ public String isLogin(String username, String password) {
+ return "当前会话是否登录:" + StpUtil.isLogin();
+ }
}
diff --git a/sa-token-demo-webflux/src/main/java/com/pj/satoken/SaTokenConfigure.java b/sa-token-demo-webflux/src/main/java/com/pj/satoken/SaTokenConfigure.java
index d829098a78446430a3b72642a1749b60aeabd491..ba8da8ca9b559f9cbd61386b4ed0169fb3d10090 100644
--- a/sa-token-demo-webflux/src/main/java/com/pj/satoken/SaTokenConfigure.java
+++ b/sa-token-demo-webflux/src/main/java/com/pj/satoken/SaTokenConfigure.java
@@ -5,11 +5,7 @@ import org.springframework.context.annotation.Configuration;
import com.pj.util.AjaxJson;
-import cn.dev33.satoken.filter.SaFilterErrorStrategy;
-import cn.dev33.satoken.filter.SaFilterAuthStrategy;
import cn.dev33.satoken.reactor.filter.SaReactorFilter;
-import cn.dev33.satoken.router.SaRouterUtil;
-import cn.dev33.satoken.stp.StpUtil;
/**
* [Sa-Token 权限认证] 配置类
@@ -18,42 +14,28 @@ import cn.dev33.satoken.stp.StpUtil;
*/
@Configuration
public class SaTokenConfigure {
-
- /**
- * 注册 [sa-token全局过滤器]
- */
- @Bean
- public SaReactorFilter getSaReactorFilter() {
- return new SaReactorFilter()
- .addInclude("/**")
- .addExclude("/favicon.ico");
- }
-
- /**
- * 注册 [sa-token全局过滤器-认证策略]
- */
- @Bean
- public SaFilterAuthStrategy getSaFilterStrategy() {
- return r -> {
- System.out.println("---------- 进入sa-token全局过滤器 -----------");
- SaRouterUtil.match("/test/test333", () -> StpUtil.checkLogin());
-// SaRouterUtil.match("/user/**", () -> StpUtil.checkPermission("user"));
-// SaRouterUtil.match("/admin/**", () -> StpUtil.checkPermission("admin"));
-// SaRouterUtil.match("/goods/**", () -> StpUtil.checkPermission("goods"));
-// SaRouterUtil.match("/orders/**", () -> StpUtil.checkPermission("orders"));
-// SaRouterUtil.match("/notice/**", () -> StpUtil.checkPermission("notice"));
-// SaRouterUtil.match("/comment/**", () -> StpUtil.checkPermission("comment"));
- };
- }
/**
- * 注册 [sa-token全局过滤器-异常处理策略]
- */
- @Bean
- public SaFilterErrorStrategy getSaFilterErrorStrategy() {
- return e -> AjaxJson.getError(e.getMessage());
- }
-
-
+ * 注册 [sa-token全局过滤器]
+ */
+ @Bean
+ public SaReactorFilter getSaReactorFilter() {
+ return new SaReactorFilter()
+ // 指定 [拦截路由]
+ .addInclude("/**")
+ // 指定 [放行路由]
+ .addExclude("/favicon.ico")
+ // 指定[认证函数]: 每次请求执行
+ .setAuth(r -> {
+ System.out.println("---------- sa全局认证");
+ // SaRouterUtil.match("/test/test", () -> StpUtil.checkLogin());
+ })
+ // 指定[异常处理函数]:每次[认证函数]发生异常时执行此函数
+ .setError(e -> {
+ System.out.println("---------- sa全局异常 ");
+ return AjaxJson.getError(e.getMessage());
+ })
+ ;
+ }
}
diff --git a/sa-token-doc/doc/README.md b/sa-token-doc/doc/README.md
index 5087e8b0b0b50bd01ee7ac978da3da9bc0ee7a22..aafa84a29d57296a1eae496e00dcbad82b091a24 100644
--- a/sa-token-doc/doc/README.md
+++ b/sa-token-doc/doc/README.md
@@ -41,6 +41,9 @@ sa-token是一个轻量级Java权限认证框架,主要解决:登录认证
有了sa-token,你所有的权限认证问题,都不再是问题!
## Sa-Token 能做什么?
+
+![sa-token-js](https://oss.dev33.cn/sa-token/doc/sa-token-js.png)
+
- **登录验证** —— 轻松登录鉴权,并提供五种细分场景值
- **权限验证** —— 适配RBAC权限模型,不同角色不同授权
- **Session会话** —— 专业的数据缓存中心
diff --git a/sa-token-doc/doc/fun/session-model.md b/sa-token-doc/doc/fun/session-model.md
index 0017047f9b0063d9a2f006d535b7e1e76766c212..7a4eee5a0a5ac52cd44b32a310b208bdf4ffb9ac 100644
--- a/sa-token-doc/doc/fun/session-model.md
+++ b/sa-token-doc/doc/fun/session-model.md
@@ -8,9 +8,9 @@
- `自定义Session`: 指的是以一个`特定的值`作为SessionId,来分配的`Session`
-User-Session和Token-Session到底有什么不同?下面这张图可以解释两者的区别
+**假设三个客户端登录同一账号,且配置了不共享token,那么此时的Session模型是:**
-![session-model](https://oss.dev33.cn/sa-token/doc/session-model2.png 's-w')
+![session-model](https://oss.dev33.cn/sa-token/doc/session-model3.png 's-w')
简而言之:
- `Token-Session` 以token为主,只要token不同,那么对应的Session对象就不同
diff --git a/sa-token-doc/doc/lib/index.css b/sa-token-doc/doc/lib/index.css
index a5fd6fe6aace8f5d4fd5c4309e4245713f1e7cea..06859d7e6bc1bc052053e26015324252adbe2f85 100644
--- a/sa-token-doc/doc/lib/index.css
+++ b/sa-token-doc/doc/lib/index.css
@@ -12,6 +12,10 @@ body{font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu
.logo-box {display: none;}
.main-box .markdown-section{max-width: 1000px;}
}
+/* @media screen and (min-width: 1700px) {
+ .main-box .markdown-section{max-width: 70%;}
+} */
+
/* 调整一下左侧树的字体样式 */
.sidebar .sidebar-nav>ul>li>p{font-size: 1.2em; margin-top: 10px;}
diff --git a/sa-token-doc/doc/start/example.md b/sa-token-doc/doc/start/example.md
index f6e99d53080132ff5b6998275e4a338f10ff3e20..1c88558a7545736f63cf66cb22acc1e51f7604ee 100644
--- a/sa-token-doc/doc/start/example.md
+++ b/sa-token-doc/doc/start/example.md
@@ -9,7 +9,7 @@
在IDE中新建一个SpringBoot项目,例如:`sa-token-demo-springboot`(不会的同学请自行百度或者参考github示例)
-### 2、设置pom包依赖
+### 2、设置依赖
在 `pom.xml` 中添加依赖:
``` xml
@@ -26,6 +26,10 @@
你可以**零配置启动项目** ,但同时你也可以在`application.yml`中增加如下配置,定制性使用框架:
``` java
+server:
+ # 端口
+ port: 8081
+
spring:
# sa-token配置
sa-token:
@@ -41,9 +45,11 @@ spring:
is-share: false
# token风格
token-style: uuid
+ # 是否输出操作日志
+ is-log: false
```
-如果你习惯于 `application.properties` 类型的配置文件,那也很好办:
+如果你习惯于 `application.properties` 类型的配置文件,那也很好办:
百度: [springboot properties与yml 配置文件的区别](https://www.baidu.com/s?ie=UTF-8&wd=springboot%20properties%E4%B8%8Eyml%20%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E7%9A%84%E5%8C%BA%E5%88%AB)
@@ -60,14 +66,43 @@ public class SaTokenDemoApplication {
}
```
-### 5、运行
-运行代码,当你从控制台看到类似下面的内容时,就代表框架已经成功集成了
+### 5、创建测试Controller
+``` java
+@RestController
+@RequestMapping("/user/")
+public class UserController {
+
+ // 测试登录,浏览器访问: http://localhost:8081/user/doLogin?username=zhang&password=123456
+ @RequestMapping("doLogin")
+ public String doLogin(String username, String password) {
+ // 此处仅作模拟示例,真实项目需要从数据库中查询数据进行比对
+ if("zhang".equals(username) && "123456".equals(password)) {
+ StpUtil.setLoginId(10001);
+ return "登录成功";
+ }
+ return "登录失败";
+ }
+
+ // 查询登录状态,浏览器访问: http://localhost:8081/user/isLogin
+ @RequestMapping("isLogin")
+ public String isLogin(String username, String password) {
+ return "当前会话是否登录:" + StpUtil.isLogin();
+ }
+
+}
+```
+
+### 6、运行
+启动代码,从浏览器依次访问上述测试接口:
-![运行结果](https://color-test.oss-cn-qingdao.aliyuncs.com/sa-token/app-run.jpg)
+![运行结果](https://oss.dev33.cn/sa-token/doc/test-do-login.png)
+![运行结果](https://oss.dev33.cn/sa-token/doc/test-is-login.png)
+
### 详细了解
diff --git a/sa-token-doc/doc/start/webflux-example.md b/sa-token-doc/doc/start/webflux-example.md
index 377d8d4e19c0faa5dd3946411ab5a2301a33e80a..6389c3b9451025c6728aa18cc7e1cd2634e58ef9 100644
--- a/sa-token-doc/doc/start/webflux-example.md
+++ b/sa-token-doc/doc/start/webflux-example.md
@@ -5,14 +5,13 @@ WebFlux基于Reactor响应式模型开发,有着与标准ServletAPI完全不
整合示例在官方仓库的`/sa-token-demo-webflux`文件夹下,如遇到难点可结合源码进行测试学习
-
---
### 1、创建项目
在IDE中新建一个SpringBoot项目,例如:`sa-token-demo-webflux`(不会的同学请自行百度或者参考github示例)
-### 2、设置pom包依赖
+### 2、设置依赖
在 `pom.xml` 中添加依赖:
``` xml
@@ -25,31 +24,6 @@ WebFlux基于Reactor响应式模型开发,有着与标准ServletAPI完全不
```
-### 3、设置配置文件
-你可以**零配置启动项目** ,但同时你也可以在`application.yml`中增加如下配置,定制性使用框架:
-
-``` java
-spring:
- # sa-token配置
- sa-token:
- # token名称 (同时也是cookie名称)
- token-name: satoken
- # token有效期,单位s 默认30天, -1代表永不过期
- timeout: 2592000
- # token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
- activity-timeout: -1
- # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
- allow-concurrent-login: false
- # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
- is-share: false
- # token风格
- token-style: uuid
-```
-
-如果你习惯于 `application.properties` 类型的配置文件,那也很好办:
-百度: [springboot properties与yml 配置文件的区别](https://www.baidu.com/s?ie=UTF-8&wd=springboot%20properties%E4%B8%8Eyml%20%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E7%9A%84%E5%8C%BA%E5%88%AB)
-
-
### 4、创建启动类
在项目中新建包 `com.pj` ,在此包内新建主类 `SaTokenDemoApplication.java`,输入以下代码:
@@ -63,14 +37,78 @@ public class SaTokenDemoApplication {
}
```
-### 5、运行
-运行代码,当你从控制台看到类似下面的内容时,就代表框架已经成功集成了
+### 5、创建全局过滤器
+新建`SaTokenConfigure.java`,注册Sa-Token的全局过滤器
+``` java
+/**
+ * [Sa-Token 权限认证] 全局配置类
+ */
+@Configuration
+public class SaTokenConfigure {
+ /**
+ * 注册 [sa-token全局过滤器]
+ */
+ @Bean
+ public SaReactorFilter getSaReactorFilter() {
+ return new SaReactorFilter()
+ // 指定 [拦截路由]
+ .addInclude("/**")
+ // 指定 [放行路由]
+ .addExclude("/favicon.ico")
+ // 指定[认证函数]: 每次请求执行
+ .setAuth(r -> {
+ System.out.println("---------- sa全局认证");
+ // SaRouterUtil.match("/test/test", () -> StpUtil.checkLogin());
+ })
+ // 指定[异常处理函数]:每次[认证函数]发生异常时执行此函数
+ .setError(e -> {
+ System.out.println("---------- sa全局异常 ");
+ return AjaxJson.getError(e.getMessage());
+ })
+ ;
+ }
+}
+```
+?> 你只需要按照此格式复制代码即可,有关过滤器的详细用法,会在之后的章节详细介绍
+
+
+### 6、创建测试Controller
+``` java
+@RestController
+@RequestMapping("/user/")
+public class UserController {
+
+ // 测试登录,浏览器访问: http://localhost:8081/user/doLogin?username=zhang&password=123456
+ @RequestMapping("doLogin")
+ public String doLogin(String username, String password) {
+ // 此处仅作模拟示例,真实项目需要从数据库中查询数据进行比对
+ if("zhang".equals(username) && "123456".equals(password)) {
+ StpUtil.setLoginId(10001);
+ return "登录成功";
+ }
+ return "登录失败";
+ }
+
+ // 查询登录状态,浏览器访问: http://localhost:8081/user/isLogin
+ @RequestMapping("isLogin")
+ public String isLogin(String username, String password) {
+ return "当前会话是否登录:" + StpUtil.isLogin();
+ }
+
+}
+```
+
+### 7、运行
+启动代码,从浏览器依次访问上述测试接口:
-![运行结果](https://color-test.oss-cn-qingdao.aliyuncs.com/sa-token/app-run.jpg)
+![运行结果](https://oss.dev33.cn/sa-token/doc/test-do-login.png)
+![运行结果](https://oss.dev33.cn/sa-token/doc/test-is-login.png)
+**注意事项**
+更多使用示例请参考官方仓库demo
diff --git a/sa-token-doc/doc/use/dao-extend.md b/sa-token-doc/doc/use/dao-extend.md
index c78f8a057d8d28612037904062c251ee5acf888e..9e2f0c7580bfde1459c5e0c03fff400765ec09bb 100644
--- a/sa-token-doc/doc/use/dao-extend.md
+++ b/sa-token-doc/doc/use/dao-extend.md
@@ -3,12 +3,12 @@
Sa-token默认将会话数据保存在内存中,此模式读写速度最快,且避免了序列化与反序列化带来的性能消耗,但是此模式也有一些缺点,比如:重启后数据会丢失,无法在集群模式下共享数据
-为此,sa-token将数据持久操作全部抽象到 `SaTokenDao` 接口中,此设计可以保证开发者对框架进行灵活扩展,比如我们可以将会话数据存储在 `Redis`、`Memcached`等专业的缓存中间件中,做到重启数据不丢失,而且保证分布式环境下多节点的会话一致性
+为此,sa-token将数据持久操作全部抽象到 `SaTokenDao` 接口中,保证大家对框架进行灵活扩展,比如我们可以将会话数据存储在 `Redis`、`Memcached`等专业的缓存中间件中,做到重启数据不丢失,而且保证分布式环境下多节点的会话一致性
除了框架内部对`SaTokenDao`提供的基于内存的默认实现,官方仓库还提供了以下扩展方案:
-### 1. sa-token 整合 Redis (使用jdk默认序列化方式)
+### 1. Sa-Token 整合 Redis (使用jdk默认序列化方式)
``` xml
@@ -20,7 +20,7 @@ Sa-token默认将会话数据保存在内存中,此模式读写速度最快,
优点:兼容性好,缺点:Session序列化后基本不可读,对开发者来讲等同于乱码
-### 2. sa-token 整合 Redis (使用jackson序列化方式)
+### 2. Sa-Token 整合 Redis (使用jackson序列化方式)
``` xml
@@ -34,7 +34,7 @@ Sa-token默认将会话数据保存在内存中,此模式读写速度最快,
-### 集成Redis请注意
+### 集成Redis请注意:
**1. 无论使用哪种序列化方式,你都必须为项目提供一个Redis实例化方案,例如:**
diff --git a/sa-token-doc/doc/use/jur-auth.md b/sa-token-doc/doc/use/jur-auth.md
index 406d9df917fe6ff5c9cf22d99482403e7175b0df..3bc78a696a9c69ddb1b9a8ec1e1afda4f403bc8e 100644
--- a/sa-token-doc/doc/use/jur-auth.md
+++ b/sa-token-doc/doc/use/jur-auth.md
@@ -8,15 +8,14 @@
有,就让你通过。没有?那么禁止访问!
再往底了说,就是每个账号都会拥有一个权限码集合,我来验证这个集合中是否包含指定的权限码
-例如:当前账号拥有权限码集合:`["user:add", "user:delete", "user:get"]`,这时候我来验证权限 `"user:update"`,则其结果就是:**验证失败,禁止访问**
-(注意: 冒号无特殊含义,可有可无)
+例如:当前账号拥有权限码集合:`["user-add", "user-delete", "user-get"]`,这时候我来验证权限 `"user-update"`,则其结果就是:**验证失败,禁止访问**
所以现在问题的核心就是:
1. 如何获取一个账号所拥有的的权限码集合
2. 本次操作需要验证的权限码是哪个
### 获取当前账号权限码集合
-因为每个项目的需求不同,其权限设计也千变万化,【获取当前账号权限码集合】这一操作不可能内置到框架中,
+因为每个项目的需求不同,其权限设计也千变万化,因此【获取当前账号权限码集合】这一操作不可能内置到框架中,
所以`sa-token`将此操作以接口的方式暴露给你,以方便的你根据自己的业务逻辑进行重写
你需要做的就是新建一个类,实现`StpInterface`接口,例如以下代码:
@@ -67,7 +66,8 @@ public class StpInterfaceImpl implements StpInterface {
```
可参考代码:[码云:StpInterfaceImpl.java](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo-springboot/src/main/java/com/pj/satoken/StpInterfaceImpl.java)
-注意: 这里的getPermissionList()和getRoleList()是每次权限或者角色验证都会重新执行
+
+
@@ -76,16 +76,16 @@ public class StpInterfaceImpl implements StpInterface {
``` java
// 当前账号是否含有指定权限, 返回true或false
-StpUtil.hasPermission("user:update");
+StpUtil.hasPermission("user-update");
// 当前账号是否含有指定权限, 如果验证未通过,则抛出异常: NotPermissionException
-StpUtil.checkPermission("user:update");
+StpUtil.checkPermission("user-update");
// 当前账号是否含有指定权限 [指定多个,必须全部验证通过]
-StpUtil.checkPermissionAnd("user:update", "user:delete");
+StpUtil.checkPermissionAnd("user-update", "user-delete");
// 当前账号是否含有指定权限 [指定多个,只要其一验证通过即可]
-StpUtil.checkPermissionOr("user:update", "user:delete");
+StpUtil.checkPermissionOr("user-update", "user-delete");
```
扩展:`NotPermissionException` 对象可通过 `getLoginKey()` 方法获取具体是哪个 `StpLogic` 抛出的异常
@@ -96,16 +96,16 @@ StpUtil.checkPermissionOr("user:update", "user:delete");
``` java
// 当前账号是否含有指定角色标识, 返回true或false
-StpUtil.hasRole("user:update");
+StpUtil.hasRole("super-admin");
// 当前账号是否含有指定角色标识, 如果验证未通过,则抛出异常: NotRoleException
-StpUtil.checkRole("user:update");
+StpUtil.checkRole("super-admin");
// 当前账号是否含有指定角色标识 [指定多个,必须全部验证通过]
-StpUtil.checkRoleAnd("user:update", "user:delete");
+StpUtil.checkRoleAnd("super-admin", "shop-admin");
// 当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可]
-StpUtil.checkRoleOr("user:update", "user:delete");
+StpUtil.checkRoleOr("super-admin", "shop-admin");
```
扩展:`NotRoleException` 对象可通过 `getLoginKey()` 方法获取具体是哪个 `StpLogic` 抛出的异常
diff --git a/sa-token-doc/doc/use/kick.md b/sa-token-doc/doc/use/kick.md
index 692c33e1b5b8a7bc2b9b10800cde224fa3321006..db0b611ef21c043838a4b6c5b096562d3b53932c 100644
--- a/sa-token-doc/doc/use/kick.md
+++ b/sa-token-doc/doc/use/kick.md
@@ -54,6 +54,3 @@ StpUtil.logoutByLoginId(10001);
StpUtil.disableLoginId(10001, 86400);
```
-
-> 如果想管理当前账号的session怎么办? 请参考:[Session会话](/use/session)
-> 如果想查询所有账号的session怎么办? 请参考:[会话治理](/use/search-session)
\ No newline at end of file
diff --git a/sa-token-doc/doc/use/session.md b/sa-token-doc/doc/use/session.md
index 4aa65114c54923ef2e627efb831d003af5f9e4d2..42fd8ded85b3542d5ee1cb6377376c7c73a0ce2f 100644
--- a/sa-token-doc/doc/use/session.md
+++ b/sa-token-doc/doc/use/session.md
@@ -160,6 +160,3 @@ public void reset(HttpSession session) {
1. `SaSession` 与 `HttpSession` 没有任何关系,在`HttpSession`上写入的值,在`SaSession`中无法取出
2. `HttpSession`并未被框架接管,在使用sa-token时,请在任何情况下均使用`SaSession`,不要使用`HttpSession`
-
-> 如果想管理其他账号的session怎么办? 请参考:[踢人下线](/use/kick)
-> 如果想查询所有账号的session怎么办? 请参考:[会话治理](/use/search-session)
\ No newline at end of file
diff --git a/sa-token-doc/doc/use/token-style.md b/sa-token-doc/doc/use/token-style.md
index a2b640f73a66a9e42ada6d077c84b0caf3b6a31b..46bb538df3a338aa4100cf68c4f725b9e92e9fdf 100644
--- a/sa-token-doc/doc/use/token-style.md
+++ b/sa-token-doc/doc/use/token-style.md
@@ -7,39 +7,29 @@
## 内置风格
-sa-token默认的token生成策略是uuid风格, 其模样类似于:`623368f0-ae5e-4475-a53f-93e4225f16ae`
+Sa-Token默认的token生成策略是uuid风格, 其模样类似于:`623368f0-ae5e-4475-a53f-93e4225f16ae`
如果你对这种风格不太感冒,还可以将token生成设置为其他风格
怎么设置呢?只需要在yml配置文件里设置 `spring.sa-token.token-style=风格类型` 即可,其有多种取值:
-1、token-style=`uuid`,uuid风格 **(默认风格)**
-``` html
-623368f0-ae5e-4475-a53f-93e4225f16ae
-```
+``` java
+// 1. token-style=uuid —— uuid风格 (默认风格)
+"623368f0-ae5e-4475-a53f-93e4225f16ae"
-2、token-style=`simple-uuid`,同上,uuid风格, 只不过去掉了中划线:
-``` html
-6fd4221395024b5f87edd34bc3258ee8
-```
+// 2. token-style=simple-uuid —— 同上,uuid风格, 只不过去掉了中划线
+"6fd4221395024b5f87edd34bc3258ee8"
-3、token-style=`random-32`,随机32位字符串:
-``` html
-qEjyPsEA1Bkc9dr8YP6okFr5umCZNR6W
-```
+// 3. token-style=random-32 —— 随机32位字符串
+"qEjyPsEA1Bkc9dr8YP6okFr5umCZNR6W"
-4、token-style=`random-64`,随机64位字符串:
-``` html
-v4ueNLEpPwMtmOPMBtOOeIQsvP8z9gkMgIVibTUVjkrNrlfra5CGwQkViDjO8jcc
-```
+// 4. token-style=random-64 —— 随机64位字符串
+"v4ueNLEpPwMtmOPMBtOOeIQsvP8z9gkMgIVibTUVjkrNrlfra5CGwQkViDjO8jcc"
-5、token-style=`random-128`,随机128位字符串:
-``` html
-nojYPmcEtrFEaN0Otpssa8I8jpk8FO53UcMZkCP9qyoHaDbKS6dxoRPky9c6QlftQ0pdzxRGXsKZmUSrPeZBOD6kJFfmfgiRyUmYWcj4WU4SSP2ilakWN1HYnIuX0Olj
-```
+// 5. token-style=random-128 —— 随机128位字符串
+"nojYPmcEtrFEaN0Otpssa8I8jpk8FO53UcMZkCP9qyoHaDbKS6dxoRPky9c6QlftQ0pdzxRGXsKZmUSrPeZBOD6kJFfmfgiRyUmYWcj4WU4SSP2ilakWN1HYnIuX0Olj"
-6、token-style=`tik`,tik风格:
-``` html
-gr_SwoIN0MC1ewxHX_vfCW3BothWDZMMtx__
+// 6. token-style=tik —— tik风格
+"gr_SwoIN0MC1ewxHX_vfCW3BothWDZMMtx__"
```
diff --git a/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenSpringAutowired.java b/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenSpringAutowired.java
index 992d3624a050ff0e21fe1348c8a40207b9727060..01e7873099be1ad1983969b94c029a5b73d267ae 100644
--- a/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenSpringAutowired.java
+++ b/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenSpringAutowired.java
@@ -8,11 +8,11 @@ import org.springframework.util.PathMatcher;
import cn.dev33.satoken.SaTokenManager;
import cn.dev33.satoken.action.SaTokenAction;
-import cn.dev33.satoken.aop.SaTokenListener;
import cn.dev33.satoken.config.SaTokenConfig;
import cn.dev33.satoken.context.SaTokenContext;
import cn.dev33.satoken.context.SaTokenContextForThreadLocal;
import cn.dev33.satoken.dao.SaTokenDao;
+import cn.dev33.satoken.listener.SaTokenListener;
import cn.dev33.satoken.stp.StpInterface;
/**
diff --git a/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaTokenSpringAutowired.java b/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaTokenSpringAutowired.java
index c45fb68846d7976133557bae81644ff4c075c4fe..e9d243cb6231e5d2f0d59b345f926d0576584b35 100644
--- a/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaTokenSpringAutowired.java
+++ b/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaTokenSpringAutowired.java
@@ -8,10 +8,10 @@ import org.springframework.util.PathMatcher;
import cn.dev33.satoken.SaTokenManager;
import cn.dev33.satoken.action.SaTokenAction;
-import cn.dev33.satoken.aop.SaTokenListener;
import cn.dev33.satoken.config.SaTokenConfig;
import cn.dev33.satoken.context.SaTokenContext;
import cn.dev33.satoken.dao.SaTokenDao;
+import cn.dev33.satoken.listener.SaTokenListener;
import cn.dev33.satoken.stp.StpInterface;
/**