From 2c6e656834845c668c3c61a4aae07f613e7a554d Mon Sep 17 00:00:00 2001 From: shengzhang <2393584716@qq.com> Date: Sat, 2 Jan 2021 04:00:49 +0800 Subject: [PATCH] =?UTF-8?q?v1.8.0=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + README.md | 41 +- pom.xml | 3 +- sa-token-core/pom.xml | 2 +- .../dev33/satoken/config/SaTokenConfig.java | 93 +++-- .../java/cn/dev33/satoken/dao/SaTokenDao.java | 16 +- .../satoken/dao/SaTokenDaoDefaultImpl.java | 17 +- .../cn/dev33/satoken/session/SaSession.java | 112 ++++-- .../satoken/session/SaSessionCustomUtil.java | 6 +- .../cn/dev33/satoken/session/TokenSign.java | 68 ++++ .../cn/dev33/satoken/stp/SaTokenInfo.java | 1 + .../java/cn/dev33/satoken/stp/StpLogic.java | 242 +++++++----- .../java/cn/dev33/satoken/stp/StpUtil.java | 60 +-- .../cn/dev33/satoken/util/SaTokenConsts.java | 45 +++ .../dev33/satoken/util/SaTokenInsideUtil.java | 24 +- sa-token-dao-redis-jackson/.gitignore | 12 + sa-token-dao-redis-jackson/pom.xml | 35 ++ .../satoken/dao/SaTokenDaoRedisJackson.java | 185 +++++++++ .../main/resources/META-INF/spring.factories | 1 + sa-token-dao-redis/pom.xml | 16 +- .../cn/dev33/satoken/dao/SaTokenDaoRedis.java | 56 ++- sa-token-demo-springboot/pom.xml | 19 +- .../java/com/pj/SaTokenDemoApplication.java | 2 +- .../java/com/pj/satoken/MySaTokenConfig.java | 8 +- .../main/java/com/pj/satoken/StpUserUtil.java | 354 ------------------ .../main/java/com/pj/test/TestController.java | 54 ++- .../src/main/resources/application.yml | 15 +- sa-token-doc/doc/README.md | 77 ++-- sa-token-doc/doc/_sidebar.md | 6 +- sa-token-doc/doc/index.html | 5 +- sa-token-doc/doc/lib/index.css | 5 +- sa-token-doc/doc/more/update-log.md | 23 +- sa-token-doc/doc/start/download.md | 21 +- sa-token-doc/doc/start/example.md | 20 +- sa-token-doc/doc/use/at-check.md | 45 ++- sa-token-doc/doc/use/config.md | 42 +-- sa-token-doc/doc/use/dao-extend.md | 168 ++------- sa-token-doc/doc/use/jur-auth.md | 15 +- sa-token-doc/doc/use/kick.md | 19 +- sa-token-doc/doc/use/many-account.md | 4 +- sa-token-doc/doc/use/mock-person.md | 4 +- sa-token-doc/doc/use/session.md | 77 ++-- sa-token-doc/doc/use/token-style.md | 1 + sa-token-doc/index.html | 6 +- sa-token-spring-boot-starter/pom.xml | 4 +- 45 files changed, 1120 insertions(+), 910 deletions(-) create mode 100644 sa-token-core/src/main/java/cn/dev33/satoken/session/TokenSign.java create mode 100644 sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java create mode 100644 sa-token-dao-redis-jackson/.gitignore create mode 100644 sa-token-dao-redis-jackson/pom.xml create mode 100644 sa-token-dao-redis-jackson/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedisJackson.java create mode 100644 sa-token-dao-redis-jackson/src/main/resources/META-INF/spring.factories delete mode 100644 sa-token-demo-springboot/src/main/java/com/pj/satoken/StpUserUtil.java diff --git a/.gitignore b/.gitignore index f56feec7..a96470fb 100644 --- a/.gitignore +++ b/.gitignore @@ -8,5 +8,6 @@ unpackage/ .project .factorypath +/.factorypath .idea/ \ No newline at end of file diff --git a/README.md b/README.md index 3c4b7eb2..c30805e6 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@
当对方再次访问系统时,会抛出NotLoginException异常,场景值=-2
* @param loginId 账号id
*/
public void logoutByLoginId(Object loginId) {
-
- // 获取相应tokenValue
- String tokenValue = getTokenValueByLoginId(loginId);
- if(tokenValue == null) {
+ // 先获取这个账号的[id-session], 如果为null,则不执行任何操作
+ SaSession session = getSessionByLoginId(loginId);
+ if(session == null) {
return;
}
- // 清除相关数据
- SaTokenManager.getSaTokenDao().deleteKey(getKeyTokenValue(tokenValue)); // 清除token-id键值对
- SaTokenManager.getSaTokenDao().deleteKey(getKeyLoginId(loginId)); // 清除id-token键值对
- SaTokenManager.getSaTokenDao().deleteSession(getKeySession(loginId)); // 清除其session
- clearLastActivity(tokenValue); // 同时清理掉 [最后操作时间]
+ // 循环token签名列表,开始删除相关信息
+ List 只有当前会话属于登录状态才可调用
* @param isCreate 是否新建
* @return session会话
*/
@@ -474,8 +503,7 @@ public class StpLogic {
}
/**
- * 获取当前token的专属-session,如果session尚未创建,则新建并返回
- * 只有当前会话属于登录状态才可调用
+ * 获取当前token的专属-session,如果session尚未创建,则新建并返回
* @return session会话
*/
public SaSession getTokenSession() {
@@ -510,7 +538,7 @@ public class StpLogic {
// 删除[最后操作时间]
SaTokenManager.getSaTokenDao().deleteKey(getKeyLastActivityTime(tokenValue));
// 清除标记
- SaTokenManager.getSaTokenServlet().getRequest().removeAttribute(SaTokenInsideUtil.TOKEN_ACTIVITY_TIMEOUT_CHECKED_KEY);
+ SaTokenManager.getSaTokenServlet().getRequest().removeAttribute(SaTokenConsts.TOKEN_ACTIVITY_TIMEOUT_CHECKED_KEY);
}
/**
@@ -524,7 +552,7 @@ public class StpLogic {
}
// 如果本次请求已经有了[检查标记], 则立即返回
HttpServletRequest request = SaTokenManager.getSaTokenServlet().getRequest();
- if(request.getAttribute(SaTokenInsideUtil.TOKEN_ACTIVITY_TIMEOUT_CHECKED_KEY) != null) {
+ if(request.getAttribute(SaTokenConsts.TOKEN_ACTIVITY_TIMEOUT_CHECKED_KEY) != null) {
return;
}
// ------------ 验证是否已经 [临时过期]
@@ -541,7 +569,7 @@ public class StpLogic {
// --- 至此,验证已通过
// 打上[检查标记],标记一下当前请求已经通过验证,避免一次请求多次验证,造成不必要的性能消耗
- request.setAttribute(SaTokenInsideUtil.TOKEN_ACTIVITY_TIMEOUT_CHECKED_KEY, true);
+ request.setAttribute(SaTokenConsts.TOKEN_ACTIVITY_TIMEOUT_CHECKED_KEY, true);
}
/**
@@ -795,7 +823,43 @@ public class StpLogic {
throw new NotPermissionException(permissionArray[0], this.loginKey); // 没有权限抛出异常
}
}
-
+
+
+ // =================== id 反查token 相关操作 ===================
+
+
+ /**
+ * 获取指定loginId的tokenValue
+ * 在配置为允许并发登录时,此方法只会返回队列的最后一个token,
+ * 如果你需要返回此账号id的所有token,请调用 getTokenValueListByLoginId
+ * @param loginId 账号id
+ * @return token值
+ */
+ public String getTokenValueByLoginId(Object loginId) {
+ List 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-2
* @param loginId 账号id
*/
public static void logoutByLoginId(Object loginId) {
stpLogic.logoutByLoginId(loginId);
}
- /**
- * 指定loginId的会话注销登录(踢人下线)
- * @param loginId 账号id
- */
- public static void kickoutByLoginId(Object loginId) {
- stpLogic.kickoutByLoginId(loginId);
- }
// 查询相关
@@ -181,10 +176,9 @@ public class StpUtil {
}
/**
- * 获取指定loginId的session, 如果session尚未创建,isCreate=是否新建并返回
- * @param loginId 账号id
- * @param isCreate 是否新建
- * @return SaSession
+ * 获取指定loginId的session,如果session尚未创建,则新建并返回
+ * @param loginId 账号id
+ * @return session会话
*/
public static SaSession getSessionByLoginId(Object loginId) {
return stpLogic.getSessionByLoginId(loginId);
@@ -221,7 +215,6 @@ public class StpUtil {
/**
* 获取当前token的专属-session,如果session尚未创建,则新建并返回
- * 只有当前会话属于登录状态才可调用
* @return session会话
*/
public static SaSession getTokenSession() {
@@ -376,4 +369,27 @@ public class StpUtil {
}
+ // =================== id 反查token 相关操作 ===================
+
+ /**
+ * 获取指定loginId的tokenValue
+ * 在配置为允许并发登录时,此方法只会返回队列的最后一个token,
+ * 如果你需要返回此账号id的所有token,请调用 getTokenValueListByLoginId
+ * @param loginId 账号id
+ * @return token值
+ */
+ public static String getTokenValueByLoginId(Object loginId) {
+ return stpLogic.getTokenValueByLoginId(loginId);
+ }
+
+ /**
+ * 获取指定loginId的tokenValue
+ * @param loginId 账号id
+ * @return 此loginId的所有相关token
+ */
+ public static List 只有当前会话属于登录状态才可调用
- * @return session会话
- */
- public static SaSession getTokenSession() {
- return stpLogic.getTokenSession();
- }
-
-
- // =================== [临时过期] 验证相关 ===================
-
- /**
- * 检查当前token 是否已经[临时过期],如果已经过期则抛出异常
- */
- public static void checkActivityTimeout() {
- stpLogic.checkActivityTimeout();
- }
-
- /**
- * 续签当前token:(将 [最后操作时间] 更新为当前时间戳)
- *
请注意: 即时token已经 [临时过期] 也可续签成功,
- * 如果此场景下需要提示续签失败,可在此之前调用 checkActivityTimeout() 强制检查是否过期即可
- */
- public static void updateLastActivityToNow() {
- stpLogic.updateLastActivityToNow();
- }
-
-
- // =================== 过期时间相关 ===================
-
- /**
- * 获取当前登录者的token剩余有效时间 (单位: 秒)
- * @return token剩余有效时间
- */
- public static long getTimeout() {
- return stpLogic.getTokenTimeout();
- }
-
- /**
- * 获取指定loginId的token剩余有效时间 (单位: 秒)
- * @param loginId 指定loginId
- * @return token剩余有效时间
- */
- public static long getTimeoutByLoginId(Object loginId) {
- return stpLogic.getTokenTimeoutByLoginId(loginId);
- }
-
- /**
- * 获取当前登录者的Session剩余有效时间 (单位: 秒)
- * @return token剩余有效时间
- */
- public static long getSessionTimeout() {
- return stpLogic.getSessionTimeout();
- }
-
- /**
- * 获取指定loginId的Session剩余有效时间 (单位: 秒)
- * @param loginId 指定loginId
- * @return token剩余有效时间
- */
- public static long getSessionTimeoutByLoginId(Object loginId) {
- return stpLogic.getSessionTimeoutByLoginId(loginId);
- }
-
- /**
- * 获取当前token[临时过期]剩余有效时间 (单位: 秒)
- * @return token[临时过期]剩余有效时间
- */
- public static long getTokenActivityTimeout() {
- return stpLogic.getTokenActivityTimeout();
- }
-
- /**
- * 获取指定token[临时过期]剩余有效时间 (单位: 秒)
- * @param tokenValue 指定token
- * @return token[临时过期]剩余有效时间
- */
- public static long getTokenActivityTimeoutByToken(String tokenValue) {
- return stpLogic.getTokenActivityTimeoutByToken(tokenValue);
- }
-
-
-
- // =================== 权限验证操作 ===================
-
- /**
- * 指定账号id是否含有指定权限
- * @param loginId 账号id
- * @param permissionCode 权限码
- * @return 是否含有指定权限
- */
- public static boolean hasPermission(Object loginId, String permissionCode) {
- return stpLogic.hasPermission(loginId, permissionCode);
- }
-
- /**
- * 当前账号id是否含有指定权限
- * @param permissionCode 权限码
- * @return 是否含有指定权限
- */
- public static boolean hasPermission(String permissionCode) {
- return stpLogic.hasPermission(permissionCode);
- }
-
- /**
- * 当前账号是否含有指定权限, 没有就抛出异常
- * @param permissionCode 权限码
- */
- public static void checkPermission(String permissionCode) {
- stpLogic.checkPermission(permissionCode);
- }
-
- /**
- * 当前账号是否含有指定权限, [指定多个,必须全都有]
- * @param permissionCodeArray 权限码数组
- */
- public static void checkPermissionAnd(String... permissionCodeArray) {
- stpLogic.checkPermissionAnd(permissionCodeArray);
- }
-
- /**
- * 当前账号是否含有指定权限, [指定多个,有一个就可以通过]
- * @param permissionCodeArray 权限码数组
- */
- public static void checkPermissionOr(String... permissionCodeArray) {
- stpLogic.checkPermissionOr(permissionCodeArray);
- }
-
-
-}
diff --git a/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java b/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java
index 661fe6b2..096ac1c4 100644
--- a/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java
+++ b/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java
@@ -1,11 +1,17 @@
package com.pj.test;
+import java.util.Date;
+
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.annotation.SaMode;
import cn.dev33.satoken.session.SaSessionCustomUtil;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
@@ -27,22 +33,22 @@ public class TestController {
System.out.println("当前会话的token:" + StpUtil.getTokenValue());
System.out.println("当前是否登录:" + StpUtil.isLogin());
System.out.println("当前登录账号:" + StpUtil.getLoginIdDefaultNull());
+
StpUtil.setLoginId(id); // 在当前会话登录此账号
System.out.println("登录成功");
System.out.println("当前是否登录:" + StpUtil.isLogin());
System.out.println("当前登录账号:" + StpUtil.getLoginId());
System.out.println("当前登录账号:" + StpUtil.getLoginIdAsInt()); // 获取登录id并转为int
+// System.out.println("当前token信息:" + StpUtil.getTokenInfo());
-// StpUtil.logout();
-// System.out.println("注销登录");
-// System.out.println("当前是否登录:" + StpUtil.isLogin());
-// System.out.println("当前登录账号:" + StpUtil.getLoginIdDefaultNull());
-// StpUtil.setLoginId(id); // 在当前会话登录此账号
-// System.out.println("根据token找登录id:" + StpUtil.getLoginIdByToken(StpUtil.getTokenValue()));
-
- System.out.println("当前token信息:" + StpUtil.getTokenInfo()); // 获取登录id并转为int
- System.out.println("当前登录账号:" + StpUtil.getLoginIdDefaultNull());
-
+ return AjaxJson.getSuccess();
+ }
+
+ // 测试退出登录 , 浏览器访问: http://localhost:8081/test/logout
+ @RequestMapping("logout")
+ public AjaxJson logout() {
+ StpUtil.logout();
+// StpUtil.logoutByLoginId(10001);
return AjaxJson.getSuccess();
}
@@ -91,17 +97,17 @@ public class TestController {
return AjaxJson.getSuccess();
}
-
// 测试会话session接口, 浏览器访问: http://localhost:8081/test/session
@RequestMapping("session")
- public AjaxJson session() {
+ public AjaxJson session() throws JsonProcessingException {
System.out.println("======================= 进入方法,测试会话session接口 ========================= ");
System.out.println("当前是否登录:" + StpUtil.isLogin());
System.out.println("当前登录账号session的id" + StpUtil.getSession().getId());
System.out.println("当前登录账号session的id" + StpUtil.getSession().getId());
System.out.println("测试取值name:" + StpUtil.getSession().getAttribute("name"));
- StpUtil.getSession().setAttribute("name", "张三"); // 写入一个值
+ StpUtil.getSession().setAttribute("name", new Date()); // 写入一个值
System.out.println("测试取值name:" + StpUtil.getSession().getAttribute("name"));
+ System.out.println( new ObjectMapper().writeValueAsString(StpUtil.getSession()));
return AjaxJson.getSuccess();
}
@@ -155,10 +161,10 @@ public class TestController {
return AjaxJson.getSuccess();
}
- // 测试注解式鉴权, 浏览器访问: http://localhost:8081/test/atLogin
- @SaCheckLogin // 注解式鉴权:当前会话必须登录才能通过
- @RequestMapping("atLogin")
- public AjaxJson atLogin() {
+ // 测试注解式鉴权, 浏览器访问: http://localhost:8081/test/atJurOr
+ @RequestMapping("atJurOr")
+ @SaCheckPermission(value = {"user-add", "user-all", "user-delete"}, mode = SaMode.OR) // 注解式鉴权:只要具有其中一个权限即可通过校验
+ public AjaxJson atJurOr() {
return AjaxJson.getSuccessData("用户信息");
}
@@ -175,10 +181,8 @@ public class TestController {
public AjaxJson kickOut() {
// 先登录上
StpUtil.setLoginId(10001);
- // 清退下线
-// StpUtil.logoutByLoginId(10001);
// 踢下线
- StpUtil.kickoutByLoginId(10001);
+ StpUtil.logoutByLoginId(10001);
// 再尝试获取
StpUtil.getLoginId();
// 返回
@@ -188,15 +192,7 @@ public class TestController {
// 测试 浏览器访问: http://localhost:8081/test/test
@RequestMapping("test")
public AjaxJson test() {
- StpUtil.setLoginId(10001);
-// StpUtil.getSession();
- StpUtil.logout();
-
-// System.out.println(StpUtil.getSession().getId());
-// System.out.println(StpUserUtil.getSession().getId());
-// StpUtil.getSessionByLoginId(10001).setAttribute("name", "123");
-// System.out.println(StpUtil.getSessionByLoginId(10001).getAttribute("name"));
-
+ StpUtil.getTokenSession().logout();
return AjaxJson.getSuccess();
}
diff --git a/sa-token-demo-springboot/src/main/resources/application.yml b/sa-token-demo-springboot/src/main/resources/application.yml
index 97f4bb9b..118661fb 100644
--- a/sa-token-demo-springboot/src/main/resources/application.yml
+++ b/sa-token-demo-springboot/src/main/resources/application.yml
@@ -9,21 +9,14 @@ spring:
token-name: satoken
# token有效期,单位s 默认30天, -1代表永不过期
timeout: 2592000
- # token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒, 默认-1 代表不限制 (例如可以设置为1800代表30分钟内无操作就过期)
+ # token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
activity-timeout: -1
- # 在多人登录同一账号时,是否共享会话 (为true时共用一个,为false时新登录挤掉旧登录)
+ # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
+ allow-concurrent-login: true
+ # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
is-share: true
- # 是否尝试从请求体里读取token
- is-read-body: true
- # 是否尝试从header里读取token
- is-read-head: true
- # 是否尝试从cookie里读取token
- is-read-cookie: true
# token风格
token-style: uuid
- # 是否在初始化配置时打印版本字符画
- is-v: true
- tokenSessionCheckLogin: false
# redis配置
diff --git a/sa-token-doc/doc/README.md b/sa-token-doc/doc/README.md
index a497595e..c30805e6 100644
--- a/sa-token-doc/doc/README.md
+++ b/sa-token-doc/doc/README.md
@@ -1,11 +1,11 @@
sa-token v1.7.0
+sa-token v1.8.0
一个JavaWeb轻量级权限认证框架,功能全面,上手简单
-
+
@@ -17,28 +17,29 @@
## 😘 在线资料
-- ##### [官网首页:http://sa-token.dev33.cn/](http://sa-token.dev33.cn/)
-- ##### [在线文档:http://sa-token.dev33.cn/doc/index.html](http://sa-token.dev33.cn/doc/index.html)
-- ##### [需求提交:我们深知一个优秀的项目需要海纳百川,点我在线提交需求](http://sa-app.dev33.cn/wall.html?name=sa-token)
-- ##### [开源不易,求鼓励,点个star吧](https://github.com/click33/sa-token)
+
+- [官网首页:http://sa-token.dev33.cn/](http://sa-token.dev33.cn/)
+
+- [在线文档:http://sa-token.dev33.cn/doc/index.html](http://sa-token.dev33.cn/doc/index.html)
+
+- [需求提交:我们深知一个优秀的项目需要海纳百川,点我在线提交需求](http://sa-app.dev33.cn/wall.html?name=sa-token)
+
+- [开源不易,求鼓励,点个star吧](https://github.com/click33/sa-token)
## ⭐ sa-token是什么?
-- **sa-token是一个JavaWeb轻量级权限认证框架,其API调用非常简单,有多简单呢?以登录验证为例,你只需要:**
+**sa-token是一个JavaWeb轻量级权限认证框架,其API调用非常简单,有多简单呢?以登录验证为例,你只需要:**
+
``` java
// 在登录时写入当前会话的账号id
-StpUtil.setLoginId(10001);
+StpUtil.setLoginId(10001);
+
+// 然后在任意需要校验登录处调用以下API --- 如果当前会话未登录,这句代码会抛出 `NotLoginException`异常
+StpUtil.checkLogin();
```
-- **然后在任意需要验证登录权限的地方:**
-``` java
-// 检测是否登录 --- 如果当前会话未登录,下面这句代码会抛出 `NotLoginException`异常
-StpUtil.checkLogin();
-```
-
-
-- **没有复杂的封装!不要任何的配置!先写入,后鉴权!只需这两行简单的调用,即可轻松完成系统登录鉴权!**
+**没有复杂的封装!不要任何的配置!只需这两行简单的调用,即可轻松完成系统登录鉴权!**
## 🔥 框架设计思想
@@ -47,20 +48,38 @@ StpUtil.checkLogin();
- 功能强大:能涵盖的功能全部涵盖,不让你用个框架还要自己给框架打各种补丁
+**如果上面的示例能够证明`sa-token`的简单,那么以下API则可以证明`sa-token`的强大**
+``` java
+StpUtil.setLoginId(10001); // 标记当前会话登录的账号id
+StpUtil.getLoginId(); // 获取当前会话登录的账号id
+StpUtil.isLogin(); // 获取当前会话是否已经登录, 返回true或false
+StpUtil.logout(); // 当前会话注销登录
+StpUtil.logoutByLoginId(10001); // 让账号为10001的会话注销登录(踢人下线)
+StpUtil.hasRole("super-admin"); // 查询当前账号是否含有指定角色标识, 返回true或false
+StpUtil.hasPermission("user:add"); // 查询当前账号是否含有指定权限, 返回true或false
+StpUtil.getSession(); // 获取当前账号id的Session
+StpUtil.getSessionByLoginId(10001); // 获取账号id为10001的Session
+StpUtil.getTokenValueByLoginId(10001); // 获取账号id为10001的token令牌值
+```
+**sa-token的API众多,请恕此处无法为您逐一展示,更多示例请戳官方在线文档**
+
+
+
+
## 💦️️ 涵盖功能
-- ⚡ **登录验证** —— 轻松登录鉴权,并提供五种细分场景值
-- ⚡ **权限验证** —— 拦截违规调用,不同角色不同授权
-- ⚡ **自定义session会话** —— 专业的数据缓存中心
-- ⚡ **踢人下线** —— 将违规用户立刻清退下线
-- ⚡ **模拟他人账号** —— 实时操作任意用户状态数据
-- ⚡ **持久层扩展** —— 可集成redis、MongoDB等专业缓存中间件
-- ⚡ **多账号认证体系** —— 比如一个商城项目的user表和admin表分开鉴权
-- ⚡ **无cookie模式** —— APP、小程序等前后台分离场景
-- ⚡ **注解式鉴权** —— 优雅的将鉴权与业务代码分离
-- ⚡ **花式token生成** —— 内置六种token风格,还可自定义token生成策略
-- ⚡ **自动续签** —— 提供两种token过期策略,灵活搭配使用,还可自动续签
-- ⚡ **组件自动注入** —— 零配置与Spring等框架集成
-- ⚡ **更多功能正在集成中...** —— 如有您有好想法或者建议,欢迎加群交流
+- **登录验证** —— 轻松登录鉴权,并提供五种细分场景值
+- **权限验证** —— 拦截违规调用,不同角色不同授权
+- **Session会话** —— 专业的数据缓存中心
+- **踢人下线** —— 将违规用户立刻清退下线
+- **模拟他人账号** —— 实时操作任意用户状态数据
+- **持久层扩展** —— 可集成redis、MongoDB等专业缓存中间件
+- **多账号认证体系** —— 比如一个商城项目的user表和admin表分开鉴权
+- **无Cookie模式** —— APP、小程序等前后台分离场景
+- **注解式鉴权** —— 优雅的将鉴权与业务代码分离
+- **花式token生成** —— 内置六种token风格,还可自定义token生成策略
+- **自动续签** —— 提供两种token过期策略,灵活搭配使用,还可自动续签
+- **组件自动注入** —— 零配置与Spring等框架集成
+- **更多功能正在集成中...** —— 如有您有好想法或者建议,欢迎加群交流
## 🔨 贡献代码
diff --git a/sa-token-doc/doc/_sidebar.md b/sa-token-doc/doc/_sidebar.md
index 3819b545..f0db84c1 100644
--- a/sa-token-doc/doc/_sidebar.md
+++ b/sa-token-doc/doc/_sidebar.md
@@ -8,10 +8,10 @@
- **使用**
- [登录验证](/use/login-auth)
- [权限验证](/use/jur-auth)
- - [session会话](/use/session)
+ - [Session会话](/use/session)
- [踢人下线](/use/kick)
- - [持久层扩展(集成redis)](/use/dao-extend)
- - [无cookie模式(前后台分离)](/use/not-cookie)
+ - [持久层扩展(集成Redis)](/use/dao-extend)
+ - [无Cookie模式(前后台分离)](/use/not-cookie)
- [模拟他人](/use/mock-person)
- [多账号验证](/use/many-account)
- [注解式鉴权](/use/at-check)
diff --git a/sa-token-doc/doc/index.html b/sa-token-doc/doc/index.html
index d181edd8..511f2746 100644
--- a/sa-token-doc/doc/index.html
+++ b/sa-token-doc/doc/index.html
@@ -7,7 +7,7 @@
-
+
@@ -22,6 +22,7 @@