From fd829c34b9783c065961f8d0737e634fec5d0ba1 Mon Sep 17 00:00:00 2001
From: click33 <2393584716@qq.com>
Date: Thu, 20 Oct 2022 06:14:58 +0800
Subject: [PATCH 01/16] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=A4=9A=E8=B4=A6?=
=?UTF-8?q?=E5=8F=B7=E4=BD=93=E7=B3=BB=E6=B7=B7=E5=90=88=E9=89=B4=E6=9D=83?=
=?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../main/java/com/pj/satoken/StpUserUtil.java | 1032 +++++++++++++++++
sa-token-doc/up/many-account.md | 38 +
2 files changed, 1070 insertions(+)
create mode 100644 sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/StpUserUtil.java
diff --git a/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/StpUserUtil.java b/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/StpUserUtil.java
new file mode 100644
index 00000000..198e2225
--- /dev/null
+++ b/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/StpUserUtil.java
@@ -0,0 +1,1032 @@
+package com.pj.satoken;
+
+import java.util.List;
+
+import org.springframework.stereotype.Component;
+
+import cn.dev33.satoken.SaManager;
+import cn.dev33.satoken.fun.SaFunction;
+import cn.dev33.satoken.session.SaSession;
+import cn.dev33.satoken.stp.SaLoginModel;
+import cn.dev33.satoken.stp.SaTokenInfo;
+import cn.dev33.satoken.stp.StpLogic;
+
+/**
+ * Sa-Token 权限认证工具类 (User版)
+ * @author kong
+ */
+@Component
+public class StpUserUtil {
+
+ private StpUserUtil() {}
+
+ /**
+ * 账号类型标识
+ */
+ public static final String TYPE = "user";
+
+ /**
+ * 底层的 StpLogic 对象
+ */
+ public static StpLogic stpLogic = new StpLogic(TYPE);
+
+ /**
+ * 获取当前 StpLogic 的账号类型
+ * @return See Note
+ */
+ public static String getLoginType(){
+ return stpLogic.getLoginType();
+ }
+
+ /**
+ * 重置 StpLogic 对象
+ *
1、更改此账户的 StpLogic 对象
+ *
2、put 到全局 StpLogic 集合中
+ *
+ * @param newStpLogic /
+ */
+ public static void setStpLogic(StpLogic newStpLogic) {
+ // 重置此账户的 StpLogic 对象
+ stpLogic = newStpLogic;
+
+ // 添加到全局 StpLogic 集合中
+ // 以便可以通过 SaManager.getStpLogic(type) 的方式来全局获取到这个 StpLogic
+ SaManager.putStpLogic(newStpLogic);
+ }
+
+ /**
+ * 获取 StpLogic 对象
+ * @return /
+ */
+ public static StpLogic getStpLogic() {
+ return stpLogic;
+ }
+
+
+ // ------------------- 获取token 相关 -------------------
+
+ /**
+ * 返回token名称
+ * @return 此StpLogic的token名称
+ */
+ public static String getTokenName() {
+ return stpLogic.getTokenName();
+ }
+
+ /**
+ * 在当前会话写入当前TokenValue
+ * @param tokenValue token值
+ */
+ public static void setTokenValue(String tokenValue){
+ stpLogic.setTokenValue(tokenValue);
+ }
+
+ /**
+ * 在当前会话写入当前TokenValue
+ * @param tokenValue token值
+ * @param cookieTimeout Cookie存活时间(秒)
+ */
+ public static void setTokenValue(String tokenValue, int cookieTimeout){
+ stpLogic.setTokenValue(tokenValue, cookieTimeout);
+ }
+
+ /**
+ * 获取当前TokenValue
+ * @return 当前tokenValue
+ */
+ public static String getTokenValue() {
+ return stpLogic.getTokenValue();
+ }
+
+ /**
+ * 获取当前TokenValue (不裁剪前缀)
+ * @return /
+ */
+ public static String getTokenValueNotCut(){
+ return stpLogic.getTokenValueNotCut();
+ }
+
+ /**
+ * 获取当前会话的Token信息
+ * @return token信息
+ */
+ public static SaTokenInfo getTokenInfo() {
+ return stpLogic.getTokenInfo();
+ }
+
+
+ // ------------------- 登录相关操作 -------------------
+
+ // --- 登录
+
+ /**
+ * 会话登录
+ * @param id 账号id,建议的类型:(long | int | String)
+ */
+ public static void login(Object id) {
+ stpLogic.login(id);
+ }
+
+ /**
+ * 会话登录,并指定登录设备类型
+ * @param id 账号id,建议的类型:(long | int | String)
+ * @param device 设备类型
+ */
+ public static void login(Object id, String device) {
+ stpLogic.login(id, device);
+ }
+
+ /**
+ * 会话登录,并指定是否 [记住我]
+ *
+ * @param id 账号id,建议的类型:(long | int | String)
+ * @param isLastingCookie 是否为持久Cookie
+ */
+ public static void login(Object id, boolean isLastingCookie) {
+ stpLogic.login(id, isLastingCookie);
+ }
+
+ /**
+ * 会话登录,并指定此次登录token的有效期, 单位:秒
+ *
+ * @param id 账号id,建议的类型:(long | int | String)
+ * @param timeout 此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的timeout值)
+ */
+ public static void login(Object id, long timeout) {
+ stpLogic.login(id, timeout);
+ }
+
+ /**
+ * 会话登录,并指定所有登录参数Model
+ *
+ * @param id 登录id,建议的类型:(long | int | String)
+ * @param loginModel 此次登录的参数Model
+ */
+ public static void login(Object id, SaLoginModel loginModel) {
+ stpLogic.login(id, loginModel);
+ }
+
+ /**
+ * 创建指定账号id的登录会话
+ * @param id 登录id,建议的类型:(long | int | String)
+ * @return 返回会话令牌
+ */
+ public static String createLoginSession(Object id) {
+ return stpLogic.createLoginSession(id);
+ }
+
+ /**
+ * 创建指定账号id的登录会话
+ * @param id 登录id,建议的类型:(long | int | String)
+ * @param loginModel 此次登录的参数Model
+ * @return 返回会话令牌
+ */
+ public static String createLoginSession(Object id, SaLoginModel loginModel) {
+ return stpLogic.createLoginSession(id, loginModel);
+ }
+
+ // --- 注销
+
+ /**
+ * 会话注销
+ */
+ public static void logout() {
+ stpLogic.logout();
+ }
+
+ /**
+ * 会话注销,根据账号id
+ * @param loginId 账号id
+ */
+ public static void logout(Object loginId) {
+ stpLogic.logout(loginId);
+ }
+
+ /**
+ * 会话注销,根据账号id 和 设备类型
+ *
+ * @param loginId 账号id
+ * @param device 设备类型 (填null代表注销所有设备类型)
+ */
+ public static void logout(Object loginId, String device) {
+ stpLogic.logout(loginId, device);
+ }
+
+ /**
+ * 会话注销,根据指定 Token
+ *
+ * @param tokenValue 指定token
+ */
+ public static void logoutByTokenValue(String tokenValue) {
+ stpLogic.logoutByTokenValue(tokenValue);
+ }
+
+ /**
+ * 踢人下线,根据账号id
+ *
当对方再次访问系统时,会抛出NotLoginException异常,场景值=-5
+ * + * @param loginId 账号id + */ + public static void kickout(Object loginId) { + stpLogic.kickout(loginId); + } + + /** + * 踢人下线,根据账号id 和 设备类型 + *当对方再次访问系统时,会抛出NotLoginException异常,场景值=-5
+ * + * @param loginId 账号id + * @param device 设备类型 (填null代表踢出所有设备类型) + */ + public static void kickout(Object loginId, String device) { + stpLogic.kickout(loginId, device); + } + + /** + * 踢人下线,根据指定 Token + *当对方再次访问系统时,会抛出NotLoginException异常,场景值=-5
+ * + * @param tokenValue 指定token + */ + public static void kickoutByTokenValue(String tokenValue) { + stpLogic.kickoutByTokenValue(tokenValue); + } + + /** + * 顶人下线,根据账号id 和 设备类型 + *当对方再次访问系统时,会抛出NotLoginException异常,场景值=-4
+ * + * @param loginId 账号id + * @param device 设备类型 (填null代表顶替所有设备类型) + */ + public static void replaced(Object loginId, String device) { + stpLogic.replaced(loginId, device); + } + + + // 查询相关 + + /** + * 当前会话是否已经登录 + * @return 是否已登录 + */ + public static boolean isLogin() { + return stpLogic.isLogin(); + } + + /** + * 检验当前会话是否已经登录,如未登录,则抛出异常 + */ + public static void checkLogin() { + stpLogic.checkLogin(); + } + + /** + * 获取当前会话账号id, 如果未登录,则抛出异常 + * @return 账号id + */ + public static Object getLoginId() { + return stpLogic.getLoginId(); + } + + /** + * 获取当前会话账号id, 如果未登录,则返回默认值 + * @param在配置为允许并发登录时,此方法只会返回队列的最后一个token, + * 如果你需要返回此账号id的所有token,请调用 getTokenValueListByLoginId + * @param loginId 账号id + * @return token值 + */ + public static String getTokenValueByLoginId(Object loginId) { + return stpLogic.getTokenValueByLoginId(loginId); + } + + /** + * 获取指定账号id指定设备类型端的tokenValue + *
在配置为允许并发登录时,此方法只会返回队列的最后一个token,
+ * 如果你需要返回此账号id的所有token,请调用 getTokenValueListByLoginId
+ * @param loginId 账号id
+ * @param device 设备类型
+ * @return token值
+ */
+ public static String getTokenValueByLoginId(Object loginId, String device) {
+ return stpLogic.getTokenValueByLoginId(loginId, device);
+ }
+
+ /**
+ * 获取指定账号id的tokenValue集合
+ * @param loginId 账号id
+ * @return 此loginId的所有相关token
+ */
+ public static List 此方法不会直接将此账号id踢下线,如需封禁后立即掉线,请追加调用 StpUtil.logout(id)
+ *
+ * @param loginId 指定账号id
+ * @param time 封禁时间, 单位: 秒 (-1=永久封禁)
+ */
+ public static void disable(Object loginId, long time) {
+ stpLogic.disable(loginId, time);
+ }
+
+ /**
+ * 判断:指定账号是否已被封禁 (true=已被封禁, false=未被封禁)
+ *
+ * @param loginId 账号id
+ * @return /
+ */
+ public static boolean isDisable(Object loginId) {
+ return stpLogic.isDisable(loginId);
+ }
+
+ /**
+ * 校验:指定账号是否已被封禁,如果被封禁则抛出异常
+ * @param loginId 账号id
+ */
+ public static void checkDisable(Object loginId) {
+ stpLogic.checkDisable(loginId);
+ }
+
+ /**
+ * 获取:指定账号剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁)
+ * @param loginId 账号id
+ * @return /
+ */
+ public static long getDisableTime(Object loginId) {
+ return stpLogic.getDisableTime(loginId);
+ }
+
+ /**
+ * 解封:指定账号
+ * @param loginId 账号id
+ */
+ public static void untieDisable(Object loginId) {
+ stpLogic.untieDisable(loginId);
+ }
+
+
+ // ------------------- 分类封禁 -------------------
+
+ /**
+ * 封禁:指定账号的指定服务
+ * 此方法不会直接将此账号id踢下线,如需封禁后立即掉线,请追加调用 StpUtil.logout(id)
+ * @param loginId 指定账号id
+ * @param service 指定服务
+ * @param time 封禁时间, 单位: 秒 (-1=永久封禁)
+ */
+ public static void disable(Object loginId, String service, long time) {
+ stpLogic.disable(loginId, service, time);
+ }
+
+ /**
+ * 判断:指定账号的指定服务 是否已被封禁 (true=已被封禁, false=未被封禁)
+ * @param loginId 账号id
+ * @param service 指定服务
+ * @return /
+ */
+ public static boolean isDisable(Object loginId, String service) {
+ return stpLogic.isDisable(loginId, service);
+ }
+
+ /**
+ * 校验:指定账号 指定服务 是否已被封禁,如果被封禁则抛出异常
+ * @param loginId 账号id
+ * @param services 指定服务,可以指定多个
+ */
+ public static void checkDisable(Object loginId, String... services) {
+ stpLogic.checkDisable(loginId, services);
+ }
+
+ /**
+ * 获取:指定账号 指定服务 剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁)
+ * @param loginId 账号id
+ * @param service 指定服务
+ * @return see note
+ */
+ public static long getDisableTime(Object loginId, String service) {
+ return stpLogic.getDisableTime(loginId, service);
+ }
+
+ /**
+ * 解封:指定账号、指定服务
+ * @param loginId 账号id
+ * @param services 指定服务,可以指定多个
+ */
+ public static void untieDisable(Object loginId, String... services) {
+ stpLogic.untieDisable(loginId, services);
+ }
+
+
+ // ------------------- 阶梯封禁 -------------------
+
+ /**
+ * 封禁:指定账号,并指定封禁等级
+ * @param loginId 指定账号id
+ * @param level 指定封禁等级
+ * @param time 封禁时间, 单位: 秒 (-1=永久封禁)
+ */
+ public static void disableLevel(Object loginId, int level, long time) {
+ stpLogic.disableLevel(loginId, level, time);
+ }
+
+ /**
+ * 封禁:指定账号的指定服务,并指定封禁等级
+ * @param loginId 指定账号id
+ * @param service 指定封禁服务
+ * @param level 指定封禁等级
+ * @param time 封禁时间, 单位: 秒 (-1=永久封禁)
+ */
+ public static void disableLevel(Object loginId, String service, int level, long time) {
+ stpLogic.disableLevel(loginId, service, level, time);
+ }
+
+ /**
+ * 判断:指定账号是否已被封禁到指定等级
+ *
+ * @param loginId 指定账号id
+ * @param level 指定封禁等级
+ * @return /
+ */
+ public static boolean isDisableLevel(Object loginId, int level) {
+ return stpLogic.isDisableLevel(loginId, level);
+ }
+
+ /**
+ * 判断:指定账号的指定服务,是否已被封禁到指定等级
+ *
+ * @param loginId 指定账号id
+ * @param service 指定封禁服务
+ * @param level 指定封禁等级
+ * @return /
+ */
+ public static boolean isDisableLevel(Object loginId, String service, int level) {
+ return stpLogic.isDisableLevel(loginId, service, level);
+ }
+
+ /**
+ * 校验:指定账号是否已被封禁到指定等级(如果已经达到,则抛出异常)
+ *
+ * @param loginId 指定账号id
+ * @param level 封禁等级 (只有 封禁等级 ≥ 此值 才会抛出异常)
+ */
+ public static void checkDisableLevel(Object loginId, int level) {
+ stpLogic.checkDisableLevel(loginId, level);
+ }
+
+ /**
+ * 校验:指定账号的指定服务,是否已被封禁到指定等级(如果已经达到,则抛出异常)
+ *
+ * @param loginId 指定账号id
+ * @param service 指定封禁服务
+ * @param level 封禁等级 (只有 封禁等级 ≥ 此值 才会抛出异常)
+ */
+ public static void checkDisableLevel(Object loginId, String service, int level) {
+ stpLogic.checkDisableLevel(loginId, service, level);
+ }
+
+ /**
+ * 获取:指定账号被封禁的等级,如果未被封禁则返回-2
+ *
+ * @param loginId 指定账号id
+ * @return /
+ */
+ public static int getDisableLevel(Object loginId) {
+ return stpLogic.getDisableLevel(loginId);
+ }
+
+ /**
+ * 获取:指定账号的 指定服务 被封禁的等级,如果未被封禁则返回-2
+ *
+ * @param loginId 指定账号id
+ * @param service 指定封禁服务
+ * @return /
+ */
+ public static int getDisableLevel(Object loginId, String service) {
+ return stpLogic.getDisableLevel(loginId, service);
+ }
+
+
+ // ------------------- 身份切换 -------------------
+
+ /**
+ * 临时切换身份为指定账号id
+ * @param loginId 指定loginId
+ */
+ public static void switchTo(Object loginId) {
+ stpLogic.switchTo(loginId);
+ }
+
+ /**
+ * 结束临时切换身份
+ */
+ public static void endSwitch() {
+ stpLogic.endSwitch();
+ }
+
+ /**
+ * 当前是否正处于[身份临时切换]中
+ * @return 是否正处于[身份临时切换]中
+ */
+ public static boolean isSwitch() {
+ return stpLogic.isSwitch();
+ }
+
+ /**
+ * 在一个代码段里方法内,临时切换身份为指定账号id
+ * @param loginId 指定账号id
+ * @param function 要执行的方法
+ */
+ public static void switchTo(Object loginId, SaFunction function) {
+ stpLogic.switchTo(loginId, function);
+ }
+
+
+ // ------------------- 二级认证 -------------------
+
+ /**
+ * 在当前会话 开启二级认证
+ * @param safeTime 维持时间 (单位: 秒)
+ */
+ public static void openSafe(long safeTime) {
+ stpLogic.openSafe(safeTime);
+ }
+
+ /**
+ * 当前会话 是否处于二级认证时间内
+ * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时
+ */
+ public static boolean isSafe() {
+ return stpLogic.isSafe();
+ }
+
+ /**
+ * 检查当前会话是否已通过二级认证,如未通过则抛出异常
+ */
+ public static void checkSafe() {
+ stpLogic.checkSafe();
+ }
+
+ /**
+ * 获取当前会话的二级认证剩余有效时间 (单位: 秒, 返回-2代表尚未通过二级认证)
+ * @return 剩余有效时间
+ */
+ public static long getSafeTime() {
+ return stpLogic.getSafeTime();
+ }
+
+ /**
+ * 在当前会话 结束二级认证
+ */
+ public static void closeSafe() {
+ stpLogic.closeSafe();
+ }
+
+}
diff --git a/sa-token-doc/up/many-account.md b/sa-token-doc/up/many-account.md
index e69c2b5b..12cb3022 100644
--- a/sa-token-doc/up/many-account.md
+++ b/sa-token-doc/up/many-account.md
@@ -188,6 +188,44 @@ public class StpUserUtil {
}
```
+### 9、多账号体系混合鉴权
+QQ群中经常有小伙伴提问:在多账号体系下,怎么在 SaInterceptor 拦截器中给一个接口登录鉴权?
+
+其实这个问题,主要是靠你的业务需求来决定,以后台 Admin 账号和前台 User 账号为例:
+
+``` java
+// 注册 Sa-Token 拦截器
+@Override
+public void addInterceptors(InterceptorRegistry registry) {
+ registry.addInterceptor(new SaInterceptor(handle -> {
+
+ // 如果这个接口,要求客户端登录了后台 Admin 账号才能访问:
+ SaRouter.match("/art/getInfo").check(r -> StpUtil.checkLogin());
+
+ // 如果这个接口,要求客户端登录了前台 User 账号才能访问:
+ SaRouter.match("/art/getInfo").check(r -> StpUserUtil.checkLogin());
+
+ // 如果这个接口,要求客户端同时登录 Admin 和 User 账号,才能访问:
+ SaRouter.match("/art/getInfo").check(r -> {
+ StpUtil.checkLogin();
+ StpUserUtil.checkLogin();
+ });
+
+ // 如果这个接口,要求客户端登录 Admin 和 User 账号任意一个,就能访问:
+ SaRouter.match("/art/getInfo").check(r -> {
+ if(StpUtil.isLogin() == false && StpUserUtil.isLogin() == false) {
+ throw new SaTokenException("请登录后再访问接口");
+ }
+ });
+
+ })).addPathPatterns("/**");
+}
+```
+
+
+
+
+
---
Date: Thu, 20 Oct 2022 06:16:02 +0800
Subject: [PATCH 02/16] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20`sa-token-quick-logi?=
=?UTF-8?q?n`=20=E6=8F=92=E4=BB=B6=E6=8C=87=E5=AE=9A=E6=8B=A6=E6=88=AA?=
=?UTF-8?q?=E6=8E=92=E9=99=A4=E8=B7=AF=E7=94=B1=E4=B8=8D=E7=94=9F=E6=95=88?=
=?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../main/java/com/pj/test/TestController.java | 2 +-
.../src/main/resources/application.yml | 2 +-
.../dev33/satoken/quick/SaQuickRegister.java | 23 +++++++++++--------
3 files changed, 16 insertions(+), 11 deletions(-)
diff --git a/sa-token-demo/sa-token-demo-quick-login/src/main/java/com/pj/test/TestController.java b/sa-token-demo/sa-token-demo-quick-login/src/main/java/com/pj/test/TestController.java
index 29fd21ba..5ad5cedb 100644
--- a/sa-token-demo/sa-token-demo-quick-login/src/main/java/com/pj/test/TestController.java
+++ b/sa-token-demo/sa-token-demo-quick-login/src/main/java/com/pj/test/TestController.java
@@ -21,7 +21,7 @@ public class TestController {
+ " Sa-Token " + SaTokenConsts.VERSION_NO + "
-
- * 你可以通过yml、properties、java代码等形式配置本类参数,具体请查阅官方文档: http://sa-token.dev33.cn/
+ * 你可以通过yml、properties、java代码等形式配置本类参数,具体请查阅官方文档: https://sa-token.cc/
*
* @author kong
*
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java
index ad45165d..59af034c 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java
@@ -30,7 +30,7 @@ public class SaTokenConsts {
/**
* Sa-Token 开发文档地址
*/
- public static final String DEV_DOC_URL = "http://sa-token.dev33.cn";
+ public static final String DEV_DOC_URL = "https://sa-token.cc";
// =================== 常量key标记 ===================
diff --git a/sa-token-demo/sa-token-demo-alone-redis/pom.xml b/sa-token-demo/sa-token-demo-alone-redis/pom.xml
index 4770482a..18112cde 100644
--- a/sa-token-demo/sa-token-demo-alone-redis/pom.xml
+++ b/sa-token-demo/sa-token-demo-alone-redis/pom.xml
@@ -31,7 +31,7 @@
- 资源页 (登录后才可进入本页面)
"
+ "
"
+ "
**注:**示例源码在`/sa-token-demo/sa-token-demo-quick-login`目录下,可结合源码查看学习
diff --git a/sa-token-doc/plugin/temp-token.md b/sa-token-doc/plugin/temp-token.md
index dd44ba22..13921c97 100644
--- a/sa-token-doc/plugin/temp-token.md
+++ b/sa-token-doc/plugin/temp-token.md
@@ -59,6 +59,8 @@ SaTempUtil.deleteToken(token);
**[sa-token-temp]** 模块允许以JWT作为逻辑内核完成工作,你只需要引入以下依赖,所有上层API保持不变
+
+
``` xml
需要!只有项目初始化了正确的 Redis 实例,`Sa-Token`才可以使用 Redis 进行数据持久化,参考以下`yml配置`:
-``` java
-# 端口
+
+
+
+``` yaml
spring:
# redis配置
redis:
@@ -77,6 +109,30 @@ spring:
# 连接池中的最小空闲连接
min-idle: 0
```
+
+``` properties
+# Redis数据库索引(默认为0)
+spring.redis.database=1
+# Redis服务器地址
+spring.redis.host=127.0.0.1
+# Redis服务器连接端口
+spring.redis.port=6379
+# Redis服务器连接密码(默认为空)
+# spring.redis.password=
+# 连接超时时间
+spring.redis.timeout=10s
+# 连接池最大连接数
+spring.redis.lettuce.pool.max-active=200
+# 连接池最大阻塞等待时间(使用负值表示没有限制)
+spring.redis.lettuce.pool.max-wait=-1ms
+# 连接池中的最大空闲连接
+spring.redis.lettuce.pool.max-idle=10
+# 连接池中的最小空闲连接
+spring.redis.lettuce.pool.min-idle=0
+```
+
+
+
**3. 集成 Redis 后,是我额外手动保存数据,还是框架自动保存?**
diff --git a/sa-token-doc/up/token-prefix.md b/sa-token-doc/up/token-prefix.md
index 7d88a46c..390e4f54 100644
--- a/sa-token-doc/up/token-prefix.md
+++ b/sa-token-doc/up/token-prefix.md
@@ -13,11 +13,21 @@
此时后端如果不做任何特殊处理,框架将会把`Bearer `视为token的一部分,无法正常读取token信息,导致鉴权失败。
为此,我们需要在yml中添加如下配置:
-``` java
+
+
+
+``` yaml
sa-token:
# token前缀
token-prefix: Bearer
```
+
+``` properties
+# token前缀
+sa-token.token-prefix: Bearer
+```
+
+
此时 Sa-Token 便可在读取 Token 时裁剪掉 `Bearer`,成功获取`xxxx-xxxx-xxxx-xxxx`。
diff --git a/sa-token-doc/up/token-style.md b/sa-token-doc/up/token-style.md
index 8cbc31da..78f9620a 100644
--- a/sa-token-doc/up/token-style.md
+++ b/sa-token-doc/up/token-style.md
@@ -59,7 +59,7 @@ public class SaTokenConfigure {
```
2、再次调用 `StpUtil.login(10001)`方法进行登录,观察其生成的token样式:
-``` html
+``` java
gfuPSwZsnUhwgz08GTCH4wOgasWtc3odP4HLwXJ7NDGOximTvT4OlW19zeLH
```
diff --git a/sa-token-doc/use/config.md b/sa-token-doc/use/config.md
index d5455054..40db73b8 100644
--- a/sa-token-doc/use/config.md
+++ b/sa-token-doc/use/config.md
@@ -6,10 +6,10 @@
### 方式1、在 application.yml 配置
-
+
-
-``` java
+
+``` yaml
############## Sa-Token 配置 ##############
############## 在线参考:https://sa-token.dev33.cn/doc.html#/use/config ##############
sa-token:
@@ -29,8 +29,8 @@ sa-token:
is-log: false
```
-
-``` java
+
+``` properties
############## Sa-Token 配置 ##############
############## 在线参考:https://sa-token.dev33.cn/doc.html#/use/config ##############
@@ -50,7 +50,7 @@ sa-token.token-style=uuid
sa-token.is-log=false
```
-
+
@@ -181,7 +181,10 @@ Client 端:
配置示例:
-``` yml
+
+
+
+``` yaml
# Sa-Token 配置
sa-token:
# SSO-相关配置
@@ -189,6 +192,13 @@ sa-token:
# SSO-Server端 单点登录授权地址
auth-url: http://sa-sso-server.com:9000/sso/auth
```
+
+``` properties
+# SSO-Server端 单点登录授权地址
+sa-token.sso.auth-url=http://sa-sso-server.com:9000/sso/auth
+```
+
+
@@ -207,7 +217,9 @@ sa-token:
| pastClientTokenTimeout | long | 7200 | `Past-Client-Token` 保存的时间(单位:秒) ,默认为-1,代表延续 `Client-Token` 的有效时间 |
配置示例:
-``` yml
+
+
+``` yaml
# Sa-Token 配置
sa-token:
token-name: satoken-server
@@ -218,6 +230,18 @@ sa-token:
is-password: true
is-client: true
```
+
+``` properties
+# Sa-Token 配置
+sa-token.token-name=satoken-server
+# OAuth2.0 配置
+sa-token.oauth2.is-code=true
+sa-token.oauth2.is-implicit=true
+sa-token.oauth2.is-password=true
+sa-token.oauth2.is-client=true
+```
+
+
##### SaClientModel属性定义
| 参数名称 | 类型 | 默认值 | 说明 |
@@ -300,30 +324,24 @@ sa-token:
在开发 SSO 模块时,我们需要在 sso-client 配置认证中心的各种地址,特别是在模式三下,一般代码会变成这样:
-``` java
+``` yaml
sa-token:
sso:
# SSO-Server端 统一认证地址
auth-url: http://sa-sso-server.com:9000/sso/auth
- # 使用Http请求校验ticket
- is-http: true
# SSO-Server端 ticket校验地址
check-ticket-url: http://sa-sso-server.com:9000/sso/checkTicket
# 单点注销地址
slo-url: http://sa-sso-server.com:9000/sso/logout
- # 接口调用秘钥
- secretkey: kQwIOrYvnXmSDkwEiFngrKidMcdrgKor
# SSO-Server端 查询userinfo地址
userinfo-url: http://sa-sso-server.com:9000/sso/userinfo
```
一堆 xxx-url 配置比较繁琐,且含有大量重复字符,现在我们可以将其简化为:
-``` java
+``` yaml
sa-token:
sso:
server-url: http://sa-sso-server.com:9000
- is-http: true
- secretkey: kQwIOrYvnXmSDkwEiFngrKidMcdrgKor
```
只要你配置了 `server-url` 地址,Sa-Token 就可以自动拼接出其它四个地址:
diff --git a/sa-token-doc/use/route-check.md b/sa-token-doc/use/route-check.md
index f515f7d6..2ce32104 100644
--- a/sa-token-doc/use/route-check.md
+++ b/sa-token-doc/use/route-check.md
@@ -44,7 +44,7 @@ public class SaTokenConfigure implements WebMvcConfigurer {
registry.addInterceptor(new SaInterceptor(handler -> {
// 指定一条 match 规则
SaRouter
- .match("/**") // 拦截的 path 列表,可以写多个
+ .match("/**") // 拦截的 path 列表,可以写多个 */
.notMatch("/user/doLogin") // 排除掉的 path 列表,可以写多个
.check(r -> StpUtil.checkLogin()); // 要执行的校验动作,可以写完整的 lambda 表达式
From 7d41430a5f3a12e1d99f8286991b19d562689488 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=AD=94=E6=98=8E?= <2393584716@qq.com>
Date: Thu, 20 Oct 2022 14:25:34 +0000
Subject: [PATCH 06/16] update sa-token-doc/start/example.md.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: 孔明 <2393584716@qq.com>
---
sa-token-doc/start/example.md | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/sa-token-doc/start/example.md b/sa-token-doc/start/example.md
index 0059f1b0..889995b2 100644
--- a/sa-token-doc/start/example.md
+++ b/sa-token-doc/start/example.md
@@ -66,9 +66,8 @@ sa-token:
``` properties
-server:
- # 端口
- port: 8081
+# 端口
+server.port=8081
############## Sa-Token 配置 ##############
From fe9aebc5cfb7eb99a453c24f1f266a50155b6e18 Mon Sep 17 00:00:00 2001
From: click33 <2393584716@qq.com>
Date: Thu, 20 Oct 2022 22:38:08 +0800
Subject: [PATCH 07/16] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=96=87=E6=A1=A3?=
=?UTF-8?q?=E9=85=8D=E8=89=B2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sa-token-doc/static/doc.css | 3 +++
1 file changed, 3 insertions(+)
diff --git a/sa-token-doc/static/doc.css b/sa-token-doc/static/doc.css
index 2ec73991..dca40bfb 100644
--- a/sa-token-doc/static/doc.css
+++ b/sa-token-doc/static/doc.css
@@ -140,6 +140,9 @@ body{font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu
.lang-js .token.string{color: #ddd;}
.lang-js .token.punctuation{color: #ddd;}
+/* yaml 和 properties 语言优化 */
+.lang-yaml .token.punctuation{color: #eee;}
+.lang-properties .token.attr-name{color: #22a2c9;}
/* ------- markdown 内容样式优化 ------- */
From 6592b625233efa2e6ecfe7827700d850fbd3145e Mon Sep 17 00:00:00 2001
From: click33 <2393584716@qq.com>
Date: Fri, 21 Oct 2022 11:27:29 +0800
Subject: [PATCH 08/16] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=96=87=E6=A1=A3..?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitee/ISSUE_TEMPLATE.md | 2 +-
.github/ISSUE_TEMPLATE.md | 2 +-
README.md | 43 +++++----
.../dev33/satoken/config/SaTokenConfig.java | 2 +-
.../cn/dev33/satoken/util/SaTokenConsts.java | 2 +-
.../sa-token-demo-alone-redis/pom.xml | 2 +-
sa-token-demo/sa-token-demo-case/pom.xml | 2 +-
sa-token-demo/sa-token-demo-jwt/pom.xml | 2 +-
.../sa-token-demo-oauth2-client/pom.xml | 2 +-
.../src/main/resources/templates/index.html | 2 +-
.../sa-token-demo-oauth2-server/pom.xml | 2 +-
.../sa-token-demo-quick-login/pom.xml | 2 +-
sa-token-demo/sa-token-demo-solon/pom.xml | 2 +-
.../sa-token-demo-springboot-redis/pom.xml | 2 +-
.../sa-token-demo-springboot/pom.xml | 2 +-
.../sa-token-demo-sso-server-h5/login.js | 2 +-
.../sa-token-demo-sso-server/pom.xml | 2 +-
.../src/main/resources/static/sa-res/login.js | 2 +-
.../sa-token-demo-sso1-client/pom.xml | 2 +-
.../sa-token-demo-sso2-client/pom.xml | 2 +-
.../sa-token-demo-sso3-client/pom.xml | 2 +-
sa-token-demo/sa-token-demo-test/pom.xml | 2 +-
.../src/main/resources/application.yml | 2 +-
sa-token-demo/sa-token-demo-thymeleaf/pom.xml | 2 +-
sa-token-demo/sa-token-demo-webflux/pom.xml | 2 +-
.../sa-token-demo-websocket-spring/pom.xml | 2 +-
sa-token-demo/sa-token-demo-websocket/pom.xml | 2 +-
sa-token-doc/README.md | 88 ++++++++++---------
sa-token-doc/doc.html | 4 +-
sa-token-doc/index.html | 8 +-
sa-token-doc/micro/gateway-auth.md | 4 +-
sa-token-doc/micro/id-token.md | 8 +-
sa-token-doc/micro/import-intro.md | 8 +-
sa-token-doc/oauth2/oauth2-server.md | 6 +-
sa-token-doc/sso/sso-server.md | 4 +-
sa-token-doc/sso/sso-type1.md | 4 +-
sa-token-doc/sso/sso-type2.md | 4 +-
sa-token-doc/start/download.md | 18 ++--
sa-token-doc/start/example.md | 11 ++-
sa-token-doc/start/new-version.md | 4 +-
sa-token-doc/start/webflux-example.md | 4 +-
sa-token-doc/use/config.md | 6 +-
.../src/main/resources/static/sa-res/login.js | 2 +-
.../core/context/model/SaCookieTest.java | 6 +-
.../satoken/core/util/SaFoxUtilTest.java | 42 ++++-----
45 files changed, 167 insertions(+), 159 deletions(-)
diff --git a/.gitee/ISSUE_TEMPLATE.md b/.gitee/ISSUE_TEMPLATE.md
index 17b29a20..8c2f41de 100644
--- a/.gitee/ISSUE_TEMPLATE.md
+++ b/.gitee/ISSUE_TEMPLATE.md
@@ -1,2 +1,2 @@
请在以下地址复制 issue 模板进行提交:
-https://sa-token.dev33.cn/doc.html#/fun/issue-template
+https://sa-token.cc/doc.html#/fun/issue-template
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
index 17b29a20..8c2f41de 100644
--- a/.github/ISSUE_TEMPLATE.md
+++ b/.github/ISSUE_TEMPLATE.md
@@ -1,2 +1,2 @@
请在以下地址复制 issue 模板进行提交:
-https://sa-token.dev33.cn/doc.html#/fun/issue-template
+https://sa-token.cc/doc.html#/fun/issue-template
diff --git a/README.md b/README.md
index 5ae7d794..f1f2d1f4 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
+
Sa-Token v1.31.0
一个轻量级 Java 权限认证框架,让鉴权变得简单、优雅!
@@ -16,7 +16,7 @@
---
## 前言:
-- [在线文档:http://sa-token.dev33.cn/](http://sa-token.dev33.cn/)
+- [在线文档:https://sa-token.cc](https://sa-token.cc)
- 注:学习测试请拉取 master 分支,dev 为正在开发的分支,有很多特性并不稳定。
@@ -27,26 +27,33 @@
**Sa-Token** 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。
-登录认证示例:
+Sa-Token 旨在以简单、优雅的方式完成系统的权限认证部分,以登录认证为例,你只需要:
``` java
-// 会话登录:参数指定在当前客户端登录的账号id
+// 会话登录,参数填登录人的账号id
StpUtil.login(10001);
-
-// 会话校验:在需要校验登录处调用以下方法,如果会话未登录会抛出 `NotLoginException` 异常
-StpUtil.checkLogin();
-
-// 会话注销:在当前客户端退出已登录的会话
-StpUtil.logout();
```
-踢人下线:
+无需实现任何接口,无需创建任何配置文件,只需要这一句静态代码的调用,便可以完成会话登录认证。
+
+如果一个接口需要登录后才能访问,我们只需调用以下代码:
+
+``` java
+// 校验当前客户端是否已经登录,如果未登录则抛出 `NotLoginException` 异常
+StpUtil.checkLogin();
+```
+
+在 Sa-Token 中,大多数功能都可以一行代码解决:
+
+踢人下线示例:
+
``` java
// 将账号id为 10077 的会话踢下线
StpUtil.kickout(10077);
```
-权限认证示例:
+权限认证:
+
``` java
// 注解鉴权:只有具备 `user:add` 权限的会话才可以进入方法
@SaCheckPermission("user:add")
@@ -70,6 +77,8 @@ registry.addInterceptor(new SaInterceptor(handler -> {
})).addPathPatterns("/**");
```
+当你受够 Shiro、SpringSecurity 等框架的三拜九叩之后,你就会明白,相对于这些传统老牌框架,Sa-Token 的 API 设计是多么的简单、优雅!
+
## Sa-Token 功能模块一览
@@ -115,13 +124,13 @@ Sa-Token-SSO 由简入难划分为三种模式,解决不同架构下的 SSO
| 系统架构 | 采用模式 | 简介 | 文档链接 |
| :-------- | :-------- | :-------- | :-------- |
-| 前端同域 + 后端同 Redis | 模式一 | 共享Cookie同步会话 | [文档](http://sa-token.dev33.cn/doc.html#/sso/sso-type1)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso1-client) |
-| 前端不同域 + 后端同 Redis | 模式二 | URL重定向传播会话 | [文档](http://sa-token.dev33.cn/doc.html#/sso/sso-type2)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso2-client) |
-| 前端不同域 + 后端 不同Redis | 模式三 | Http请求获取会话 | [文档](http://sa-token.dev33.cn/doc.html#/sso/sso-type3)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso3-client) |
+| 前端同域 + 后端同 Redis | 模式一 | 共享Cookie同步会话 | [文档](https://sa-token.cc/doc.html#/sso/sso-type1)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso1-client) |
+| 前端不同域 + 后端同 Redis | 模式二 | URL重定向传播会话 | [文档](https://sa-token.cc/doc.html#/sso/sso-type2)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso2-client) |
+| 前端不同域 + 后端 不同Redis | 模式三 | Http请求获取会话 | [文档](https://sa-token.cc/doc.html#/sso/sso-type3)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso3-client) |
1. 前端同域:就是指多个系统可以部署在同一个主域名之下,比如:`c1.domain.com`、`c2.domain.com`、`c3.domain.com`
-2. 后端同Redis:就是指多个系统可以连接同一个Redis。PS:这里并不需要把所有项目的数据都放在同一个Redis中,Sa-Token提供了 **`[权限缓存与业务缓存分离]`** 的解决方案,详情戳:[Alone独立Redis插件](http://sa-token.dev33.cn/doc.html#/plugin/alone-redis)
+2. 后端同Redis:就是指多个系统可以连接同一个Redis。PS:这里并不需要把所有项目的数据都放在同一个Redis中,Sa-Token提供了 **`[权限缓存与业务缓存分离]`** 的解决方案,详情戳:[Alone独立Redis插件](https://sa-token.cc/doc.html#/plugin/alone-redis)
3. 如果既无法做到前端同域,也无法做到后端同Redis,那么只能走模式三,Http请求获取会话(Sa-Token对SSO提供了完整的封装,你只需要按照示例从文档上复制几段代码便可以轻松集成)
## Sa-Token-OAuth2 授权认证
@@ -134,7 +143,7 @@ Sa-OAuth2 模块分为四种授权模式,解决不同场景下的授权需求
| 密码式(Password) | Client直接拿着用户的账号密码换取授权 Token |
| 客户端凭证(Client Credentials)| Server 端针对 Client 级别的 Token,代表应用自身的资源授权 |
-详细参考文档:[http://sa-token.dev33.cn/doc.html#/oauth2/readme](http://sa-token.dev33.cn/doc.html#/oauth2/readme)
+详细参考文档:[https://sa-token.cc/doc.html#/oauth2/readme](https://sa-token.cc/doc.html#/oauth2/readme)
## 使用 Sa-Token 的开源项目
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java
index 48b6ac71..068a4eb2 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java
@@ -5,7 +5,7 @@ import java.io.Serializable;
/**
* Sa-Token 配置类 Model
*
更多资料请参考 Sa-Token 官方文档地址:
- http://sa-token.dev33.cn/
+ https://sa-token.cc/
diff --git a/sa-token-demo/sa-token-demo-oauth2-server/pom.xml b/sa-token-demo/sa-token-demo-oauth2-server/pom.xml
index 0acb237b..a4e8beb9 100644
--- a/sa-token-demo/sa-token-demo-oauth2-server/pom.xml
+++ b/sa-token-demo/sa-token-demo-oauth2-server/pom.xml
@@ -28,7 +28,7 @@
+
Sa-Token v1.31.0
一个轻量级 Java 权限认证框架,让鉴权变得简单、优雅!
@@ -16,7 +16,7 @@
---
## 前言:️️
-为了保证新同学不迷路,请允许我唠叨一下:无论您从何处看到本篇文章,最新开发文档永远在:[http://sa-token.dev33.cn/](http://sa-token.dev33.cn/),
+为了保证新同学不迷路,请允许我唠叨一下:无论您从何处看到本篇文章,最新开发文档永远在:[https://sa-token.cc](https://sa-token.cc),
建议收藏在浏览器书签,如果您已经身处本网站下,则请忽略此条说明。
本文档将会尽力讲解每个功能的设计原因、应用场景,用心阅读文档,你学习到的将不止是 `Sa-Token` 框架本身,更是绝大多数场景下权限设计的最佳实践。
@@ -27,71 +27,68 @@
**Sa-Token** 是一个轻量级 Java 权限认证框架,主要解决:**登录认证**、**权限认证**、**单点登录**、**OAuth2.0**、**分布式Session会话**、**微服务网关鉴权**
等一系列权限相关问题。
-Sa-Token 的 API 设计非常简单,有多简单呢?以登录认证为例,你只需要:
+Sa-Token 旨在以简单、优雅的方式完成系统的权限认证部分,以登录认证为例,你只需要:
``` java
-// 在登录时写入当前会话的账号id
+// 会话登录,参数填登录人的账号id
StpUtil.login(10001);
+```
-// 然后在需要校验登录处调用以下方法:
-// 如果当前会话未登录,这句代码会抛出 `NotLoginException` 异常
+无需实现任何接口,无需创建任何配置文件,只需要这一句静态代码的调用,便可以完成会话登录认证。
+
+如果一个接口需要登录后才能访问,我们只需调用以下代码:
+
+``` java
+// 校验当前客户端是否已经登录,如果未登录则抛出 `NotLoginException` 异常
StpUtil.checkLogin();
```
-至此,我们已经借助 Sa-Token 完成登录认证!
+在 Sa-Token 中,大多数功能都可以一行代码解决:
-此时的你小脑袋可能飘满了问号,就这么简单?自定义 Realm 呢?全局过滤器呢?我不用写各种配置文件吗?
+踢人下线示例:
-没错,在 Sa-Token 中,登录认证就是如此简单,不需要任何的复杂前置工作,只需这一行简单的API调用,就可以完成会话登录认证!
-
-当你受够 Shiro、SpringSecurity 等框架的三拜九叩之后,你就会明白,相对于这些传统老牌框架,Sa-Token 的 API 设计是多么的简单、优雅!
-
-权限认证示例(只有具备 `user:add` 权限的会话才可以进入请求)
``` java
+// 将账号id为 10077 的会话踢下线
+StpUtil.kickout(10077);
+```
+
+权限认证:
+
+``` java
+// 注解鉴权:只有具备 `user:add` 权限的会话才可以进入方法
@SaCheckPermission("user:add")
-@RequestMapping("/user/insert")
public String insert(SysUser user) {
- // ...
- return "用户增加";
+ // ...
+ return "用户增加";
}
```
-将某个账号踢下线(待到对方再次访问系统时会抛出`NotLoginException`异常)
+路由拦截鉴权:
+
``` java
-// 将账号id为 10001 的会话踢下线
-StpUtil.kickout(10001);
+// 根据路由划分模块,不同模块不同鉴权
+registry.addInterceptor(new SaInterceptor(handler -> {
+ SaRouter.match("/user/**", r -> StpUtil.checkPermission("user"));
+ SaRouter.match("/admin/**", r -> StpUtil.checkPermission("admin"));
+ SaRouter.match("/goods/**", r -> StpUtil.checkPermission("goods"));
+ SaRouter.match("/orders/**", r -> StpUtil.checkPermission("orders"));
+ SaRouter.match("/notice/**", r -> StpUtil.checkPermission("notice"));
+ // 更多模块...
+})).addPathPatterns("/**");
```
-在 Sa-Token 中,绝大多数功能都可以 **一行代码** 完成:
-``` java
-StpUtil.login(10001); // 标记当前会话登录的账号id
-StpUtil.getLoginId(); // 获取当前会话登录的账号id
-StpUtil.isLogin(); // 获取当前会话是否已经登录, 返回true或false
-StpUtil.logout(); // 当前会话注销登录
-StpUtil.kickout(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令牌值
-StpUtil.login(10001, "PC"); // 指定设备类型登录,常用于“同端互斥登录”
-StpUtil.kickout(10001, "PC"); // 指定账号指定设备类型踢下线 (不同端不受影响)
-StpUtil.openSafe(120); // 在当前会话开启二级认证,有效期为120秒
-StpUtil.checkSafe(); // 校验当前会话是否处于二级认证有效期内,校验失败会抛出异常
-StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号
-```
-
-即使不运行测试,相信您也能意会到绝大多数 API 的用法。
-
+当你受够 Shiro、SpringSecurity 等框架的三拜九叩之后,你就会明白,相对于这些传统老牌框架,Sa-Token 的 API 设计是多么的简单、优雅!
## Sa-Token 功能一览
+Sa-Token 目前主要五大功能模块:登录认证、权限认证、单点登录、OAuth2.0、微服务鉴权。
+
- **登录认证** —— 单端登录、多端登录、同端互斥登录、七天内免登录
- **权限认证** —— 权限认证、角色认证、会话二级认证
- **Session会话** —— 全端共享Session、单端独享Session、自定义Session
- **踢人下线** —— 根据账号id踢人下线、根据Token值踢人下线
-- **账号封禁** —— 指定天数封禁、永久封禁、设定解封时间
+- **账号封禁** —— 登录封禁、按照业务分类封禁、按照处罚阶梯封禁
- **持久层扩展** —— 可集成Redis、Memcached等专业缓存中间件,重启数据不丢失
- **分布式会话** —— 提供jwt集成、共享数据中心两种分布式会话方案
- **微服务网关鉴权** —— 适配Gateway、ShenYu、Zuul等常见网关的路由拦截认证
@@ -100,13 +97,13 @@ StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号
- **二级认证** —— 在已登录的基础上再次认证,保证安全性
- **Basic认证** —— 一行代码接入 Http Basic 认证
- **独立Redis** —— 将权限缓存与业务缓存分离
-- **临时Token验证** —— 解决短时间的Token授权问题
+- **临时Token认证** —— 解决短时间的Token授权问题
- **模拟他人账号** —— 实时操作任意用户状态数据
- **临时身份切换** —— 将会话身份临时切换为其它账号
- **前后台分离** —— APP、小程序等不支持Cookie的终端
- **同端互斥登录** —— 像QQ一样手机电脑同时在线,但是两个手机上互斥登录
- **多账号认证体系** —— 比如一个商城项目的user表和admin表分开鉴权
-- **花式token生成** —— 内置六种Token风格,还可:自定义Token生成策略、自定义Token前缀
+- **Token风格定制** —— 内置六种Token风格,还可:自定义Token生成策略、自定义Token前缀
- **注解式鉴权** —— 优雅的将鉴权与业务代码分离
- **路由拦截式鉴权** —— 根据路由拦截鉴权,可适配restful模式
- **自动续签** —— 提供两种Token过期策略,灵活搭配使用,还可自动续签
@@ -117,6 +114,10 @@ StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号
- **开箱即用** —— 提供SpringMVC、WebFlux等常见web框架starter集成包,真正的开箱即用
- **更多功能正在集成中...** —— 如有您有好想法或者建议,欢迎加群交流
+功能结构图:
+
+
+
## 开源仓库 Star 趋势
@@ -133,6 +134,7 @@ StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号
参考:[Sa-Token 生态](/more/link)
+
## 交流群
QQ交流群:614714762 [点击加入](https://jq.qq.com/?_wv=1027&k=F96A2mrl)
diff --git a/sa-token-doc/doc.html b/sa-token-doc/doc.html
index 32e5c236..6190bbf7 100644
--- a/sa-token-doc/doc.html
+++ b/sa-token-doc/doc.html
@@ -246,8 +246,8 @@
diff --git a/sa-token-doc/index.html b/sa-token-doc/index.html
index 4f62bf9f..826e9f58 100644
--- a/sa-token-doc/index.html
+++ b/sa-token-doc/index.html
@@ -360,7 +360,7 @@
-
+
@@ -533,7 +533,7 @@