From cb4d5fbf61a8c3356453a9b560f26ec5bee1ebff Mon Sep 17 00:00:00 2001
From: click33 <2393584716@qq.com>
Date: Wed, 7 Sep 2022 07:55:27 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E8=B4=A6=E5=8F=B7=E5=B0=81?=
=?UTF-8?q?=E7=A6=81=E6=A8=A1=E5=9D=97=E7=9A=84=E5=8D=95=E5=85=83=E6=B5=8B?=
=?UTF-8?q?=E8=AF=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../satoken/annotation/SaCheckDisable.java | 2 +-
.../java/com/pj/satoken/at/StpUserUtil.java | 224 +++++++-----------
.../java/com/pj/satoken/at/StpUserUtil.java | 224 +++++++-----------
.../java/com/pj/test/JwtForMixinTest.java | 7 +-
.../annotation/SaAnnotationController.java | 24 +-
.../SaAnnotationControllerTest.java | 21 ++
.../integrate/configure/HandlerException.java | 7 +
.../dev33/satoken/springboot/BasicsTest.java | 40 +++-
8 files changed, 263 insertions(+), 286 deletions(-)
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckDisable.java b/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckDisable.java
index cb9b43f7..dfd17858 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckDisable.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckDisable.java
@@ -8,7 +8,7 @@ import java.lang.annotation.Target;
import cn.dev33.satoken.util.SaTokenConsts;
/**
- * 服务禁用校验:在没有被禁用服务的情况下才可以进入方法
+ * 服务禁用校验:在没有被禁用指定服务的情况下才可以进入方法
*
*
可标注在函数、类上(效果等同于标注在此类的所有方法上)
*
diff --git a/sa-token-demo/sa-token-demo-springboot-redis/src/main/java/com/pj/satoken/at/StpUserUtil.java b/sa-token-demo/sa-token-demo-springboot-redis/src/main/java/com/pj/satoken/at/StpUserUtil.java
index 1e697e67..f87e8c8c 100644
--- a/sa-token-demo/sa-token-demo-springboot-redis/src/main/java/com/pj/satoken/at/StpUserUtil.java
+++ b/sa-token-demo/sa-token-demo-springboot-redis/src/main/java/com/pj/satoken/at/StpUserUtil.java
@@ -15,6 +15,8 @@ import cn.dev33.satoken.stp.StpLogic;
*/
public class StpUserUtil {
+ private StpUserUtil() {}
+
/**
* 账号类型标识
*/
@@ -132,18 +134,30 @@ public class StpUserUtil {
}
/**
- * 会话登录,并指定是否 [记住我]
- * @param id 账号id,建议的类型:(long | int | String)
- * @param isLastingCookie 是否为持久Cookie
+ * 会话登录,并指定是否 [记住我]
+ *
+ * @param id 账号id,建议的类型:(long | int | String)
+ * @param isLastingCookie 是否为持久Cookie
*/
public static void login(Object id, boolean isLastingCookie) {
stpLogic.login(id, isLastingCookie);
}
/**
- * 会话登录,并指定所有登录参数Model
- * @param id 登录id,建议的类型:(long | int | String)
- * @param loginModel 此次登录的参数Model
+ * 会话登录,并指定此次登录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);
@@ -410,6 +424,14 @@ public class StpUserUtil {
return stpLogic.getTokenSession();
}
+ /**
+ * 获取当前匿名 Token-Session (可在未登录情况下使用的Token-Session)
+ * @return Token-Session 对象
+ */
+ public static SaSession getAnonTokenSession() {
+ return stpLogic.getAnonTokenSession();
+ }
+
// =================== [临时有效期] 验证相关 ===================
@@ -742,13 +764,24 @@ public class StpUserUtil {
/**
* 封禁指定账号
- *
此方法不会直接将此账号id踢下线,而是在对方再次登录时抛出`DisableLoginException`异常
+ *
此方法不会直接将此账号id踢下线,如需封禁后立即掉线,请追加调用 StpUtil.logout(id)
* @param loginId 指定账号id
* @param disableTime 封禁时间, 单位: 秒 (-1=永久封禁)
*/
public static void disable(Object loginId, long disableTime) {
stpLogic.disable(loginId, disableTime);
}
+
+ /**
+ * 封禁 指定账号 指定服务
+ *
此方法不会直接将此账号id踢下线,如需封禁后立即掉线,请追加调用 StpUtil.logout(id)
+ * @param loginId 指定账号id
+ * @param service 指定服务
+ * @param disableTime 封禁时间, 单位: 秒 (-1=永久封禁)
+ */
+ public static void disable(Object loginId, String service, long disableTime) {
+ stpLogic.disable(loginId, service, disableTime);
+ }
/**
* 指定账号是否已被封禁 (true=已被封禁, false=未被封禁)
@@ -758,6 +791,33 @@ public class StpUserUtil {
public static boolean isDisable(Object loginId) {
return stpLogic.isDisable(loginId);
}
+
+ /**
+ * 指定账号 指定服务 是否已被封禁 (true=已被封禁, false=未被封禁)
+ * @param loginId 账号id
+ * @param service 指定服务
+ * @return see note
+ */
+ public static boolean isDisable(Object loginId, String service) {
+ return stpLogic.isDisable(loginId, service);
+ }
+
+ /**
+ * 校验指定账号是否已被封禁,如果被封禁则抛出异常
+ * @param loginId 账号id
+ */
+ public static void checkDisable(Object loginId) {
+ stpLogic.checkDisable(loginId);
+ }
+
+ /**
+ * 校验 指定账号 指定服务 是否已被封禁,如果被封禁则抛出异常
+ * @param loginId 账号id
+ * @param services 指定服务,可以指定多个
+ */
+ public static void checkDisable(Object loginId, String... services) {
+ stpLogic.checkDisable(loginId, services);
+ }
/**
* 获取指定账号剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁)
@@ -768,6 +828,16 @@ public class StpUserUtil {
return stpLogic.getDisableTime(loginId);
}
+ /**
+ * 获取 指定账号 指定服务 剩余封禁时间,单位:秒(-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
@@ -775,6 +845,15 @@ public class StpUserUtil {
public static void untieDisable(Object loginId) {
stpLogic.untieDisable(loginId);
}
+
+ /**
+ * 解封指定账号、指定服务
+ * @param loginId 账号id
+ * @param services 指定服务,可以指定多个
+ */
+ public static void untieDisable(Object loginId, String... services) {
+ stpLogic.untieDisable(loginId, services);
+ }
// =================== 身份切换 ===================
@@ -852,135 +931,4 @@ public class StpUserUtil {
stpLogic.closeSafe();
}
-
- // =================== 历史API,兼容旧版本 ===================
-
- /**
- *
本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.getLoginType() ,使用方式保持不变
- *
- * 获取当前StpLogin的loginKey
- * @return 当前StpLogin的loginKey
- */
- @Deprecated
- public static String getLoginKey(){
- return stpLogic.getLoginType();
- }
-
- /**
- * 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变
- *
- * 在当前会话上登录id
- * @param loginId 登录id,建议的类型:(long | int | String)
- */
- @Deprecated
- public static void setLoginId(Object loginId) {
- stpLogic.login(loginId);
- }
-
- /**
- * 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变
- *
- * 在当前会话上登录id, 并指定登录设备类型
- * @param loginId 登录id,建议的类型:(long | int | String)
- * @param device 设备类型
- */
- @Deprecated
- public static void setLoginId(Object loginId, String device) {
- stpLogic.login(loginId, device);
- }
-
- /**
- * 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变
- *
- * 在当前会话上登录id, 并指定登录设备类型
- * @param loginId 登录id,建议的类型:(long | int | String)
- * @param isLastingCookie 是否为持久Cookie
- */
- @Deprecated
- public static void setLoginId(Object loginId, boolean isLastingCookie) {
- stpLogic.login(loginId, isLastingCookie);
- }
-
- /**
- * 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变
- *
- * 在当前会话上登录id, 并指定所有登录参数Model
- * @param loginId 登录id,建议的类型:(long | int | String)
- * @param loginModel 此次登录的参数Model
- */
- @Deprecated
- public static void setLoginId(Object loginId, SaLoginModel loginModel) {
- stpLogic.login(loginId, loginModel);
- }
-
- /**
- * 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.kickout() ,使用方式保持不变
- *
- * 会话注销,根据账号id (踢人下线)
- * 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-2
- * @param loginId 账号id
- */
- @Deprecated
- public static void logoutByLoginId(Object loginId) {
- stpLogic.kickout(loginId);
- }
-
- /**
- *
本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.kickout() ,使用方式保持不变
- *
- * 会话注销,根据账号id and 设备类型 (踢人下线)
- * 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-2
- * @param loginId 账号id
- * @param device 设备类型 (填null代表注销所有设备类型)
- */
- @Deprecated
- public static void logoutByLoginId(Object loginId, String device) {
- stpLogic.kickout(loginId, device);
- }
-
- /**
- * 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.searchTokenValue(keyword, start, size, sortType) ,使用方式保持不变
- *
- * 根据条件查询Token
- * @param keyword 关键字
- * @param start 开始处索引 (-1代表查询所有)
- * @param size 获取数量
- *
- * @return token集合
- */
- @Deprecated
- public static List searchTokenValue(String keyword, int start, int size) {
- return stpLogic.searchTokenValue(keyword, start, size, true);
- }
-
- /**
- * 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.searchSessionId(keyword, start, size, sortType) ,使用方式保持不变
- *
- * 根据条件查询SessionId
- * @param keyword 关键字
- * @param start 开始处索引 (-1代表查询所有)
- * @param size 获取数量
- *
- * @return sessionId集合
- */
- @Deprecated
- public static List searchSessionId(String keyword, int start, int size) {
- return stpLogic.searchSessionId(keyword, start, size, true);
- }
-
- /**
- * 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.searchTokenSessionId(keyword, start, size, sortType) ,使用方式保持不变
- *
- * 根据条件查询Token专属Session的Id
- * @param keyword 关键字
- * @param start 开始处索引 (-1代表查询所有)
- * @param size 获取数量
- *
- * @return sessionId集合
- */
- @Deprecated
- public static List searchTokenSessionId(String keyword, int start, int size) {
- return stpLogic.searchTokenSessionId(keyword, start, size, true);
- }
-
}
diff --git a/sa-token-demo/sa-token-demo-springboot/src/main/java/com/pj/satoken/at/StpUserUtil.java b/sa-token-demo/sa-token-demo-springboot/src/main/java/com/pj/satoken/at/StpUserUtil.java
index 1e697e67..f87e8c8c 100644
--- a/sa-token-demo/sa-token-demo-springboot/src/main/java/com/pj/satoken/at/StpUserUtil.java
+++ b/sa-token-demo/sa-token-demo-springboot/src/main/java/com/pj/satoken/at/StpUserUtil.java
@@ -15,6 +15,8 @@ import cn.dev33.satoken.stp.StpLogic;
*/
public class StpUserUtil {
+ private StpUserUtil() {}
+
/**
* 账号类型标识
*/
@@ -132,18 +134,30 @@ public class StpUserUtil {
}
/**
- * 会话登录,并指定是否 [记住我]
- * @param id 账号id,建议的类型:(long | int | String)
- * @param isLastingCookie 是否为持久Cookie
+ * 会话登录,并指定是否 [记住我]
+ *
+ * @param id 账号id,建议的类型:(long | int | String)
+ * @param isLastingCookie 是否为持久Cookie
*/
public static void login(Object id, boolean isLastingCookie) {
stpLogic.login(id, isLastingCookie);
}
/**
- * 会话登录,并指定所有登录参数Model
- * @param id 登录id,建议的类型:(long | int | String)
- * @param loginModel 此次登录的参数Model
+ * 会话登录,并指定此次登录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);
@@ -410,6 +424,14 @@ public class StpUserUtil {
return stpLogic.getTokenSession();
}
+ /**
+ * 获取当前匿名 Token-Session (可在未登录情况下使用的Token-Session)
+ * @return Token-Session 对象
+ */
+ public static SaSession getAnonTokenSession() {
+ return stpLogic.getAnonTokenSession();
+ }
+
// =================== [临时有效期] 验证相关 ===================
@@ -742,13 +764,24 @@ public class StpUserUtil {
/**
* 封禁指定账号
- * 此方法不会直接将此账号id踢下线,而是在对方再次登录时抛出`DisableLoginException`异常
+ *
此方法不会直接将此账号id踢下线,如需封禁后立即掉线,请追加调用 StpUtil.logout(id)
* @param loginId 指定账号id
* @param disableTime 封禁时间, 单位: 秒 (-1=永久封禁)
*/
public static void disable(Object loginId, long disableTime) {
stpLogic.disable(loginId, disableTime);
}
+
+ /**
+ * 封禁 指定账号 指定服务
+ *
此方法不会直接将此账号id踢下线,如需封禁后立即掉线,请追加调用 StpUtil.logout(id)
+ * @param loginId 指定账号id
+ * @param service 指定服务
+ * @param disableTime 封禁时间, 单位: 秒 (-1=永久封禁)
+ */
+ public static void disable(Object loginId, String service, long disableTime) {
+ stpLogic.disable(loginId, service, disableTime);
+ }
/**
* 指定账号是否已被封禁 (true=已被封禁, false=未被封禁)
@@ -758,6 +791,33 @@ public class StpUserUtil {
public static boolean isDisable(Object loginId) {
return stpLogic.isDisable(loginId);
}
+
+ /**
+ * 指定账号 指定服务 是否已被封禁 (true=已被封禁, false=未被封禁)
+ * @param loginId 账号id
+ * @param service 指定服务
+ * @return see note
+ */
+ public static boolean isDisable(Object loginId, String service) {
+ return stpLogic.isDisable(loginId, service);
+ }
+
+ /**
+ * 校验指定账号是否已被封禁,如果被封禁则抛出异常
+ * @param loginId 账号id
+ */
+ public static void checkDisable(Object loginId) {
+ stpLogic.checkDisable(loginId);
+ }
+
+ /**
+ * 校验 指定账号 指定服务 是否已被封禁,如果被封禁则抛出异常
+ * @param loginId 账号id
+ * @param services 指定服务,可以指定多个
+ */
+ public static void checkDisable(Object loginId, String... services) {
+ stpLogic.checkDisable(loginId, services);
+ }
/**
* 获取指定账号剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁)
@@ -768,6 +828,16 @@ public class StpUserUtil {
return stpLogic.getDisableTime(loginId);
}
+ /**
+ * 获取 指定账号 指定服务 剩余封禁时间,单位:秒(-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
@@ -775,6 +845,15 @@ public class StpUserUtil {
public static void untieDisable(Object loginId) {
stpLogic.untieDisable(loginId);
}
+
+ /**
+ * 解封指定账号、指定服务
+ * @param loginId 账号id
+ * @param services 指定服务,可以指定多个
+ */
+ public static void untieDisable(Object loginId, String... services) {
+ stpLogic.untieDisable(loginId, services);
+ }
// =================== 身份切换 ===================
@@ -852,135 +931,4 @@ public class StpUserUtil {
stpLogic.closeSafe();
}
-
- // =================== 历史API,兼容旧版本 ===================
-
- /**
- *
本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.getLoginType() ,使用方式保持不变
- *
- * 获取当前StpLogin的loginKey
- * @return 当前StpLogin的loginKey
- */
- @Deprecated
- public static String getLoginKey(){
- return stpLogic.getLoginType();
- }
-
- /**
- * 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变
- *
- * 在当前会话上登录id
- * @param loginId 登录id,建议的类型:(long | int | String)
- */
- @Deprecated
- public static void setLoginId(Object loginId) {
- stpLogic.login(loginId);
- }
-
- /**
- * 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变
- *
- * 在当前会话上登录id, 并指定登录设备类型
- * @param loginId 登录id,建议的类型:(long | int | String)
- * @param device 设备类型
- */
- @Deprecated
- public static void setLoginId(Object loginId, String device) {
- stpLogic.login(loginId, device);
- }
-
- /**
- * 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变
- *
- * 在当前会话上登录id, 并指定登录设备类型
- * @param loginId 登录id,建议的类型:(long | int | String)
- * @param isLastingCookie 是否为持久Cookie
- */
- @Deprecated
- public static void setLoginId(Object loginId, boolean isLastingCookie) {
- stpLogic.login(loginId, isLastingCookie);
- }
-
- /**
- * 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变
- *
- * 在当前会话上登录id, 并指定所有登录参数Model
- * @param loginId 登录id,建议的类型:(long | int | String)
- * @param loginModel 此次登录的参数Model
- */
- @Deprecated
- public static void setLoginId(Object loginId, SaLoginModel loginModel) {
- stpLogic.login(loginId, loginModel);
- }
-
- /**
- * 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.kickout() ,使用方式保持不变
- *
- * 会话注销,根据账号id (踢人下线)
- * 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-2
- * @param loginId 账号id
- */
- @Deprecated
- public static void logoutByLoginId(Object loginId) {
- stpLogic.kickout(loginId);
- }
-
- /**
- *
本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.kickout() ,使用方式保持不变
- *
- * 会话注销,根据账号id and 设备类型 (踢人下线)
- * 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-2
- * @param loginId 账号id
- * @param device 设备类型 (填null代表注销所有设备类型)
- */
- @Deprecated
- public static void logoutByLoginId(Object loginId, String device) {
- stpLogic.kickout(loginId, device);
- }
-
- /**
- * 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.searchTokenValue(keyword, start, size, sortType) ,使用方式保持不变
- *
- * 根据条件查询Token
- * @param keyword 关键字
- * @param start 开始处索引 (-1代表查询所有)
- * @param size 获取数量
- *
- * @return token集合
- */
- @Deprecated
- public static List searchTokenValue(String keyword, int start, int size) {
- return stpLogic.searchTokenValue(keyword, start, size, true);
- }
-
- /**
- * 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.searchSessionId(keyword, start, size, sortType) ,使用方式保持不变
- *
- * 根据条件查询SessionId
- * @param keyword 关键字
- * @param start 开始处索引 (-1代表查询所有)
- * @param size 获取数量
- *
- * @return sessionId集合
- */
- @Deprecated
- public static List searchSessionId(String keyword, int start, int size) {
- return stpLogic.searchSessionId(keyword, start, size, true);
- }
-
- /**
- * 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.searchTokenSessionId(keyword, start, size, sortType) ,使用方式保持不变
- *
- * 根据条件查询Token专属Session的Id
- * @param keyword 关键字
- * @param start 开始处索引 (-1代表查询所有)
- * @param size 获取数量
- *
- * @return sessionId集合
- */
- @Deprecated
- public static List searchTokenSessionId(String keyword, int start, int size) {
- return stpLogic.searchTokenSessionId(keyword, start, size, true);
- }
-
}
diff --git a/sa-token-test/sa-token-jwt-test/src/test/java/com/pj/test/JwtForMixinTest.java b/sa-token-test/sa-token-jwt-test/src/test/java/com/pj/test/JwtForMixinTest.java
index f263939f..d2fd0cd2 100644
--- a/sa-token-test/sa-token-jwt-test/src/test/java/com/pj/test/JwtForMixinTest.java
+++ b/sa-token-test/sa-token-jwt-test/src/test/java/com/pj/test/JwtForMixinTest.java
@@ -207,15 +207,16 @@ public class JwtForMixinTest {
// 封号
StpUtil.disable(10007, 200);
Assertions.assertTrue(StpUtil.isDisable(10007));
- Assertions.assertEquals(dao.get("satoken:login:disable:" + 10007), DisableServiceException.BE_VALUE);
+ Assertions.assertEquals(dao.get("satoken:login:disable:login:" + 10007), DisableServiceException.BE_VALUE);
// 解封
StpUtil.untieDisable(10007);
Assertions.assertFalse(StpUtil.isDisable(10007));
- Assertions.assertEquals(dao.get("satoken:login:disable:" + 10007), null);
+ Assertions.assertEquals(dao.get("satoken:login:disable:login:" + 10007), null);
- // 封号后登陆 (会抛出 DisableLoginException 异常)
+ // 封号后校验 (会抛出 DisableLoginException 异常)
StpUtil.disable(10007, 200);
+ StpUtil.checkDisable(10007);
StpUtil.login(10007);
});
}
diff --git a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/integrate/annotation/SaAnnotationController.java b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/integrate/annotation/SaAnnotationController.java
index 95ddcc02..6141753d 100644
--- a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/integrate/annotation/SaAnnotationController.java
+++ b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/integrate/annotation/SaAnnotationController.java
@@ -3,6 +3,7 @@ package cn.dev33.satoken.integrate.annotation;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
+import cn.dev33.satoken.annotation.SaCheckDisable;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaCheckRole;
@@ -68,5 +69,26 @@ public class SaAnnotationController {
public SaResult checkSafe() {
return SaResult.ok();
}
-
+
+ // 封禁账号
+ @RequestMapping("disable")
+ public SaResult disable(long id) {
+ StpUtil.disable(id, "comment", 200);
+ return SaResult.ok();
+ }
+
+ // 服务封禁校验
+ @SaCheckDisable("comment")
+ @RequestMapping("checkDisable")
+ public SaResult checkDisable() {
+ return SaResult.ok();
+ }
+
+ // 解封账号
+ @RequestMapping("untieDisable")
+ public SaResult untieDisable(long id) {
+ StpUtil.untieDisable(id, "comment");
+ return SaResult.ok();
+ }
+
}
diff --git a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/integrate/annotation/SaAnnotationControllerTest.java b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/integrate/annotation/SaAnnotationControllerTest.java
index 967eba62..83821434 100644
--- a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/integrate/annotation/SaAnnotationControllerTest.java
+++ b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/integrate/annotation/SaAnnotationControllerTest.java
@@ -70,6 +70,10 @@ public class SaAnnotationControllerTest {
// 校验二级认证,通过
SaResult res7 = request("/at/checkSafe?satoken=" + satoken);
Assertions.assertEquals(res7.getCode(), 200);
+
+ // 访问校验封禁的接口 ,通过
+ SaResult res9 = request("/at/checkDisable?satoken=" + satoken);
+ Assertions.assertEquals(res9.getCode(), 200);
}
// 校验不通过的情况
@@ -99,6 +103,23 @@ public class SaAnnotationControllerTest {
// 校验二级认证,不通过
SaResult res7 = request("/at/checkSafe?satoken=" + satoken);
Assertions.assertEquals(res7.getCode(), 901);
+
+ // -------- 登录拿到Token
+ String satoken10042 = request("/at/login?id=10042").get("token", String.class);
+ Assertions.assertNotNull(satoken10042);
+
+ // 校验账号封禁 ,通过
+ SaResult res8 = request("/at/disable?id=10042");
+ Assertions.assertEquals(res8.getCode(), 200);
+
+ // 访问校验封禁的接口 ,不通过
+ SaResult res9 = request("/at/checkDisable?satoken=" + satoken10042);
+ Assertions.assertEquals(res9.getCode(), 904);
+
+ // 解封后就能访问了
+ request("/at/untieDisable?id=10042");
+ SaResult res10 = request("/at/checkDisable?satoken=" + satoken10042);
+ Assertions.assertEquals(res10.getCode(), 200);
}
// 测试忽略认证
diff --git a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/integrate/configure/HandlerException.java b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/integrate/configure/HandlerException.java
index 1c407411..aec6870c 100644
--- a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/integrate/configure/HandlerException.java
+++ b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/integrate/configure/HandlerException.java
@@ -3,6 +3,7 @@ package cn.dev33.satoken.integrate.configure;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
+import cn.dev33.satoken.exception.DisableServiceException;
import cn.dev33.satoken.exception.IdTokenInvalidException;
import cn.dev33.satoken.exception.NotBasicAuthException;
import cn.dev33.satoken.exception.NotLoginException;
@@ -54,5 +55,11 @@ public class HandlerException {
public SaResult handlerNotBasicAuthException(NotBasicAuthException e) {
return SaResult.error().setCode(903);
}
+
+ // 服务被封禁 ,code=904
+ @ExceptionHandler(DisableServiceException.class)
+ public SaResult handlerDisableServiceException(DisableServiceException e) {
+ return SaResult.error().setCode(904);
+ }
}
diff --git a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/springboot/BasicsTest.java b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/springboot/BasicsTest.java
index 50c93d10..c71d95ad 100644
--- a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/springboot/BasicsTest.java
+++ b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/springboot/BasicsTest.java
@@ -359,7 +359,10 @@ public class BasicsTest {
// 封号
StpUtil.disable(10007, 200);
Assertions.assertTrue(StpUtil.isDisable(10007));
- Assertions.assertEquals(dao.get("satoken:login:disable:" + 10007), DisableServiceException.BE_VALUE);
+ Assertions.assertEquals(dao.get("satoken:login:disable:login:" + 10007), DisableServiceException.BE_VALUE);
+
+ // 封号后检测一下 (会抛出 DisableLoginException 异常)
+ Assertions.assertThrows(DisableServiceException.class, () -> StpUtil.checkDisable(10007));
// 封号时间
long disableTime = StpUtil.getDisableTime(10007);
@@ -368,11 +371,38 @@ public class BasicsTest {
// 解封
StpUtil.untieDisable(10007);
Assertions.assertFalse(StpUtil.isDisable(10007));
- Assertions.assertEquals(dao.get("satoken:login:disable:" + 10007), null);
+ Assertions.assertEquals(dao.get("satoken:login:disable:login:" + 10007), null);
+ Assertions.assertDoesNotThrow(() -> StpUtil.checkDisable(10007));
+ }
- // 封号后检测一下 (会抛出 DisableLoginException 异常)
- StpUtil.disable(10007, 200);
- Assertions.assertThrows(DisableServiceException.class, () -> StpUtil.checkDisable(10007));
+ // 测试:账号封禁,根据服务
+ @Test
+ public void testDisableService() {
+ // 封掉评论功能
+ StpUtil.disable(10008, "comment", 200);
+ Assertions.assertTrue(StpUtil.isDisable(10008, "comment"));
+ Assertions.assertEquals(dao.get("satoken:login:disable:comment:" + 10008), DisableServiceException.BE_VALUE);
+ Assertions.assertNull(dao.get("satoken:login:disable:login:" + 10008));
+
+ // 封号后检测一下
+ Assertions.assertThrows(DisableServiceException.class, () -> StpUtil.checkDisable(10008, "comment"));
+ // 检查多个,有一个不通过就报异常
+ Assertions.assertThrows(DisableServiceException.class, () -> StpUtil.checkDisable(10008, "comment", "login"));
+
+ // 封号时间
+ long disableTime = StpUtil.getDisableTime(10008, "comment");
+ Assertions.assertTrue(disableTime <= 200 && disableTime >= 199);
+
+ // 解封 (不加服务名不会成功)
+ StpUtil.untieDisable(10008);
+ Assertions.assertTrue(StpUtil.isDisable(10008, "comment"));
+ Assertions.assertNotNull(dao.get("satoken:login:disable:comment:" + 10008));
+
+ // 解封 (加服务名才会成功)
+ StpUtil.untieDisable(10008, "comment");
+ Assertions.assertFalse(StpUtil.isDisable(10008, "comment"));
+ Assertions.assertEquals(dao.get("satoken:login:disable:comment:" + 10008), null);
+ Assertions.assertDoesNotThrow(() -> StpUtil.checkDisable(10007, "comment"));
}
// 测试:身份切换