diff --git a/pom.xml b/pom.xml
index 4f087cf5..d1d2fe36 100644
--- a/pom.xml
+++ b/pom.xml
@@ -256,35 +256,35 @@
1、更改此账户的 StpLogic 对象
+ *
2、put 到全局 StpLogic 集合中
+ *
3、发送日志
+ *
+ * @param newStpLogic /
*/
- public static void setStpLogic(StpLogic stpLogic) {
- StpUtil.stpLogic = stpLogic;
- // 防止自定义 stpLogic 被覆盖
- SaManager.putStpLogic(stpLogic);
+ public static void setStpLogic(StpLogic newStpLogic) {
+ // 1、重置此账户的 StpLogic 对象
+ stpLogic = newStpLogic;
+
+ // 2、添加到全局 StpLogic 集合中
+ // 以便可以通过 SaManager.getStpLogic(type) 的方式来全局获取到这个 StpLogic
+ SaManager.putStpLogic(newStpLogic);
+
+ // 3、$$ 发布事件:更新了 stpLogic 对象
+ SaTokenEventCenter.doSetStpLogic(stpLogic);
}
- // =================== 获取token 相关 ===================
+ // ------------------- 获取 token 相关 -------------------
/**
- * 返回token名称
- * @return 此StpLogic的token名称
+ * 返回 token 名称,此名称在以下地方体现:Cookie 保存 token 时的名称、提交 token 时参数的名称、存储 token 时的 key 前缀
+ *
+ * @return /
*/
public static String getTokenName() {
return stpLogic.getTokenName();
}
/**
- * 在当前会话写入当前TokenValue
- * @param tokenValue token值
+ * 在当前会话写入指定 token 值
+ *
+ * @param tokenValue token 值
*/
- public static void setTokenValue(String tokenValue) {
+ public static void setTokenValue(String tokenValue){
stpLogic.setTokenValue(tokenValue);
}
/**
- * 在当前会话写入当前TokenValue
- * @param tokenValue token值
+ * 在当前会话写入指定 token 值
+ *
+ * @param tokenValue token 值
* @param cookieTimeout Cookie存活时间(秒)
*/
- public static void setTokenValue(String tokenValue, int cookieTimeout) {
+ public static void setTokenValue(String tokenValue, int cookieTimeout){
stpLogic.setTokenValue(tokenValue, cookieTimeout);
}
/**
- * 获取当前TokenValue
+ * 在当前会话写入指定 token 值
+ *
+ * @param tokenValue token 值
+ * @param loginParameter 登录参数
+ */
+ public static void setTokenValue(String tokenValue, SaLoginParameter loginParameter){
+ stpLogic.setTokenValue(tokenValue, loginParameter);
+ }
+
+ /**
+ * 获取当前请求的 token 值
+ *
* @return 当前tokenValue
*/
public static String getTokenValue() {
@@ -106,28 +129,31 @@ public class StpClientUtil {
}
/**
- * 获取当前TokenValue (不裁剪前缀)
+ * 获取当前请求的 token 值 (不裁剪前缀)
+ *
* @return /
*/
- public static String getTokenValueNotCut() {
+ public static String getTokenValueNotCut(){
return stpLogic.getTokenValueNotCut();
}
/**
- * 获取当前会话的Token信息
- * @return token信息
+ * 获取当前会话的 token 参数信息
+ *
+ * @return token 参数信息
*/
public static SaTokenInfo getTokenInfo() {
return stpLogic.getTokenInfo();
}
- // =================== 登录相关操作 ===================
+ // ------------------- 登录相关操作 -------------------
// --- 登录
/**
* 会话登录
+ *
* @param id 账号id,建议的类型:(long | int | String)
*/
public static void login(Object id) {
@@ -135,35 +161,49 @@ public class StpClientUtil {
}
/**
- * 会话登录,并指定登录设备
+ * 会话登录,并指定登录设备类型
+ *
* @param id 账号id,建议的类型:(long | int | String)
- * @param device 设备标识
+ * @param deviceType 设备类型
*/
- public static void login(Object id, String device) {
- stpLogic.login(id, device);
+ public static void login(Object id, String deviceType) {
+ stpLogic.login(id, deviceType);
}
/**
* 会话登录,并指定是否 [记住我]
+ *
* @param id 账号id,建议的类型:(long | int | String)
- * @param isLastingCookie 是否为持久Cookie
+ * @param isLastingCookie 是否为持久Cookie,值为 true 时记住我,值为 false 时关闭浏览器需要重新登录
*/
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 的有效期, 单位:秒
*/
- public static void login(Object id, SaLoginModel loginModel) {
- stpLogic.login(id, loginModel);
+ public static void login(Object id, long timeout) {
+ stpLogic.login(id, timeout);
}
/**
- * 创建指定账号id的登录会话
- * @param id 登录id,建议的类型:(long | int | String)
+ * 会话登录,并指定所有登录参数 Model
+ *
+ * @param id 账号id,建议的类型:(long | int | String)
+ * @param loginParameter 此次登录的参数Model
+ */
+ public static void login(Object id, SaLoginParameter loginParameter) {
+ stpLogic.login(id, loginParameter);
+ }
+
+ /**
+ * 创建指定账号 id 的登录会话数据
+ *
+ * @param id 账号id,建议的类型:(long | int | String)
* @return 返回会话令牌
*/
public static String createLoginSession(Object id) {
@@ -171,26 +211,108 @@ public class StpClientUtil {
}
/**
- * 创建指定账号id的登录会话
- * @param id 登录id,建议的类型:(long | int | String)
- * @param loginModel 此次登录的参数Model
+ * 创建指定账号 id 的登录会话数据
+ *
+ * @param id 账号id,建议的类型:(long | int | String)
+ * @param loginParameter 此次登录的参数Model
* @return 返回会话令牌
*/
- public static String createLoginSession(Object id, SaLoginModel loginModel) {
- return stpLogic.createLoginSession(id, loginModel);
+ public static String createLoginSession(Object id, SaLoginParameter loginParameter) {
+ return stpLogic.createLoginSession(id, loginParameter);
}
- // --- 注销
+ /**
+ * 获取指定账号 id 的登录会话数据,如果获取不到则创建并返回
+ *
+ * @param id 账号id,建议的类型:(long | int | String)
+ * @return 返回会话令牌
+ */
+ public static String getOrCreateLoginSession(Object id) {
+ return stpLogic.getOrCreateLoginSession(id);
+ }
+
+ // --- 注销 (根据 token)
/**
- * 会话注销
+ * 在当前客户端会话注销
*/
public static void logout() {
stpLogic.logout();
}
+ /**
+ * 在当前客户端会话注销,根据注销参数
+ */
+ public static void logout(SaLogoutParameter logoutParameter) {
+ stpLogic.logout(logoutParameter);
+ }
+
+ /**
+ * 注销下线,根据指定 token
+ *
+ * @param tokenValue 指定 token
+ */
+ public static void logoutByTokenValue(String tokenValue) {
+ stpLogic.logoutByTokenValue(tokenValue);
+ }
+
+ /**
+ * 注销下线,根据指定 token、注销参数
+ *
+ * @param tokenValue 指定 token
+ * @param logoutParameter /
+ */
+ public static void logoutByTokenValue(String tokenValue, SaLogoutParameter logoutParameter) {
+ stpLogic.logoutByTokenValue(tokenValue, logoutParameter);
+ }
+
+ /**
+ * 踢人下线,根据指定 token
+ *
当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5
+ * + * @param tokenValue 指定 token + */ + public static void kickoutByTokenValue(String tokenValue) { + stpLogic.kickoutByTokenValue(tokenValue); + } + + /** + * 踢人下线,根据指定 token、注销参数 + *当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5
+ * + * @param tokenValue 指定 token + * @param logoutParameter 注销参数 + */ + public static void kickoutByTokenValue(String tokenValue, SaLogoutParameter logoutParameter) { + stpLogic.kickoutByTokenValue(tokenValue, logoutParameter); + } + + /** + * 顶人下线,根据指定 token + *当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-4
+ * + * @param tokenValue 指定 token + */ + public static void replacedByTokenValue(String tokenValue) { + stpLogic.replacedByTokenValue(tokenValue); + } + + /** + * 顶人下线,根据指定 token、注销参数 + *当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-4
+ * + * @param tokenValue 指定 token + * @param logoutParameter / + */ + public static void replacedByTokenValue(String tokenValue, SaLogoutParameter logoutParameter) { + stpLogic.replacedByTokenValue(tokenValue, logoutParameter); + } + + // --- 注销 (根据 loginId) + /** * 会话注销,根据账号id + * * @param loginId 账号id */ public static void logout(Object loginId) { @@ -198,27 +320,28 @@ public class StpClientUtil { } /** - * 会话注销,根据账号id 和 设备标识 + * 会话注销,根据账号id 和 设备类型 * * @param loginId 账号id - * @param device 设备标识 (填null代表所有注销设备) + * @param deviceType 设备类型 (填 null 代表注销该账号的所有设备类型) */ - public static void logout(Object loginId, String device) { - stpLogic.logout(loginId, device); + public static void logout(Object loginId, String deviceType) { + stpLogic.logout(loginId, deviceType); } /** - * 会话注销,根据指定 Token + * 会话注销,根据账号id 和 注销参数 * - * @param tokenValue 指定token + * @param loginId 账号id + * @param logoutParameter 注销参数 */ - public static void logoutByTokenValue(String tokenValue) { - stpLogic.logoutByTokenValue(tokenValue); + public static void logout(Object loginId, SaLogoutParameter logoutParameter) { + stpLogic.logout(loginId, logoutParameter); } /** * 踢人下线,根据账号id - *当对方再次访问系统时,会抛出NotLoginException异常,场景值=-5
+ *当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5
* * @param loginId 账号id */ @@ -227,48 +350,109 @@ public class StpClientUtil { } /** - * 踢人下线,根据账号id 和 设备标识 - *当对方再次访问系统时,会抛出NotLoginException异常,场景值=-5
+ * 踢人下线,根据账号id 和 设备类型 + *当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5
* * @param loginId 账号id - * @param device 设备标识 (填null代表踢出所有设备) + * @param deviceType 设备类型 (填 null 代表踢出该账号的所有设备类型) */ - public static void kickout(Object loginId, String device) { - stpLogic.kickout(loginId, device); + public static void kickout(Object loginId, String deviceType) { + stpLogic.kickout(loginId, deviceType); } /** - * 踢人下线,根据指定 Token - *当对方再次访问系统时,会抛出NotLoginException异常,场景值=-5
- * - * @param tokenValue 指定token - */ - public static void kickoutByTokenValue(String tokenValue) { - stpLogic.kickoutByTokenValue(tokenValue); - } - - /** - * 顶人下线,根据账号id 和 设备标识 - *当对方再次访问系统时,会抛出NotLoginException异常,场景值=-4
+ * 踢人下线,根据账号id 和 注销参数 + *当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5
* * @param loginId 账号id - * @param device 设备标识 (填null代表顶替所有设备) + * @param logoutParameter 注销参数 */ - public static void replaced(Object loginId, String device) { - stpLogic.replaced(loginId, device); + public static void kickout(Object loginId, SaLogoutParameter logoutParameter) { + stpLogic.kickout(loginId, logoutParameter); + } + + /** + * 顶人下线,根据账号id + *当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-4
+ * + * @param loginId 账号id + */ + public static void replaced(Object loginId) { + stpLogic.replaced(loginId); + } + + /** + * 顶人下线,根据账号id 和 设备类型 + *当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-4
+ * + * @param loginId 账号id + * @param deviceType 设备类型 (填 null 代表顶替该账号的所有设备类型) + */ + public static void replaced(Object loginId, String deviceType) { + stpLogic.replaced(loginId, deviceType); + } + + /** + * 顶人下线,根据账号id 和 注销参数 + *当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-4
+ * + * @param loginId 账号id + * @param logoutParameter 注销参数 + */ + public static void replaced(Object loginId, SaLogoutParameter logoutParameter) { + stpLogic.replaced(loginId, logoutParameter); + } + + // --- 注销 (会话管理辅助方法) + + /** + * 在 Account-Session 上移除 Terminal 信息 (注销下线方式) + * @param session / + * @param terminal / + */ + public static void removeTerminalByLogout(SaSession session, SaTerminalInfo terminal) { + stpLogic.removeTerminalByLogout(session, terminal); + } + + /** + * 在 Account-Session 上移除 Terminal 信息 (踢人下线方式) + * @param session / + * @param terminal / + */ + public static void removeTerminalByKickout(SaSession session, SaTerminalInfo terminal) { + stpLogic.removeTerminalByKickout(session, terminal); + } + + /** + * 在 Account-Session 上移除 Terminal 信息 (顶人下线方式) + * @param session / + * @param terminal / + */ + public static void removeTerminalByReplaced(SaSession session, SaTerminalInfo terminal) { + stpLogic.removeTerminalByReplaced(session, terminal); } - // 查询相关 + // 会话查询 /** - * 当前会话是否已经登录 - * @return 是否已登录 + * 判断当前会话是否已经登录 + * + * @return 已登录返回 true,未登录返回 false */ public static boolean isLogin() { return stpLogic.isLogin(); } + /** + * 判断指定账号是否已经登录 + * + * @return 已登录返回 true,未登录返回 false + */ + public static boolean isLogin(Object loginId) { + return stpLogic.isLogin(loginId); + } + /** * 检验当前会话是否已经登录,如未登录,则抛出异常 */ @@ -277,7 +461,8 @@ public class StpClientUtil { } /** - * 获取当前会话账号id, 如果未登录,则抛出异常 + * 获取当前会话账号id,如果未登录,则抛出异常 + * * @return 账号id */ public static Object getLoginId() { @@ -286,6 +471,7 @@ public class StpClientUtil { /** * 获取当前会话账号id, 如果未登录,则返回默认值 + * * @param在配置为允许并发登录时,此方法只会返回队列的最后一个token, - * 如果你需要返回此账号id的所有token,请调用 getTokenValueListByLoginId + * 获取指定账号 id 的 token + *
+ * 在配置为允许并发登录时,此方法只会返回队列的最后一个 token, + * 如果你需要返回此账号 id 的所有 token,请调用 getTokenValueListByLoginId + *
+ * * @param loginId 账号id * @return token值 */ @@ -659,52 +928,121 @@ public class StpClientUtil { } /** - * 获取指定账号id指定设备端的tokenValue - *在配置为允许并发登录时,此方法只会返回队列的最后一个token, - * 如果你需要返回此账号id的所有token,请调用 getTokenValueListByLoginId + * 获取指定账号 id 指定设备类型端的 token + *
+ * 在配置为允许并发登录时,此方法只会返回队列的最后一个 token, + * 如果你需要返回此账号 id 的所有 token,请调用 getTokenValueListByLoginId + *
+ * * @param loginId 账号id - * @param device 设备标识 + * @param deviceType 设备类型,填 null 代表不限设备类型 * @return token值 */ - public static String getTokenValueByLoginId(Object loginId, String device) { - return stpLogic.getTokenValueByLoginId(loginId, device); + public static String getTokenValueByLoginId(Object loginId, String deviceType) { + return stpLogic.getTokenValueByLoginId(loginId, deviceType); } /** - * 获取指定账号id的tokenValue集合 + * 获取指定账号 id 的 token 集合 + * * @param loginId 账号id - * @return 此loginId的所有相关token + * @return 此 loginId 的所有相关 token */ public static List此方法不会直接将此账号id踢下线,而是在对方再次登录时抛出`DisableLoginException`异常 + * 封禁:指定账号 + *
此方法不会直接将此账号id踢下线,如需封禁后立即掉线,请追加调用 StpUtil.logout(id) + * * @param loginId 指定账号id - * @param disableTime 封禁时间, 单位: 秒 (-1=永久封禁) + * @param time 封禁时间, 单位: 秒 (-1=永久封禁) */ - public static void disable(Object loginId, long disableTime) { - stpLogic.disable(loginId, disableTime); + public static void disable(Object loginId, long time) { + stpLogic.disable(loginId, time); } /** - * 指定账号是否已被封禁 (true=已被封禁, false=未被封禁) + * 判断:指定账号是否已被封禁 (true=已被封禁, false=未被封禁) + * * @param loginId 账号id - * @return see note + * @return / */ public static boolean isDisable(Object loginId) { return stpLogic.isDisable(loginId); } /** - * 获取指定账号剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁) + * 校验:指定账号是否已被封禁,如果被封禁则抛出异常 + * * @param loginId 账号id - * @return see note + */ + 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) { @@ -773,10 +1130,159 @@ public class StpClientUtil { } - // =================== 身份切换 =================== + // ------------------- 分类封禁 ------------------- + + /** + * 封禁:指定账号的指定服务 + *
此方法不会直接将此账号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) { @@ -791,15 +1297,17 @@ public class StpClientUtil { } /** - * 当前是否正处于[身份临时切换]中 - * @return 是否正处于[身份临时切换]中 + * 判断当前请求是否正处于 [ 身份临时切换 ] 中 + * + * @return / */ public static boolean isSwitch() { return stpLogic.isSwitch(); } /** - * 在一个代码段里方法内,临时切换身份为指定账号id + * 在一个 lambda 代码段里,临时切换身份为指定账号id,lambda 结束后自动恢复 + * * @param loginId 指定账号id * @param function 要执行的方法 */ @@ -812,6 +1320,7 @@ public class StpClientUtil { /** * 在当前会话 开启二级认证 + * * @param safeTime 维持时间 (单位: 秒) */ public static void openSafe(long safeTime) { @@ -819,7 +1328,18 @@ public class StpClientUtil { } /** - * 当前会话 是否处于二级认证时间内 + * 在当前会话 开启二级认证 + * + * @param service 业务标识 + * @param safeTime 维持时间 (单位: 秒) + */ + public static void openSafe(String service, long safeTime) { + stpLogic.openSafe(service, safeTime); + } + + /** + * 判断:当前会话是否处于二级认证时间内 + * * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时 */ public static boolean isSafe() { @@ -827,20 +1347,61 @@ public class StpClientUtil { } /** - * 检查当前会话是否已通过二级认证,如未通过则抛出异常 + * 判断:当前会话 是否处于指定业务的二级认证时间内 + * + * @param service 业务标识 + * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时 + */ + public static boolean isSafe(String service) { + return stpLogic.isSafe(service); + } + + /** + * 判断:指定 token 是否处于二级认证时间内 + * + * @param tokenValue Token 值 + * @param service 业务标识 + * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时 + */ + public static boolean isSafe(String tokenValue, String service) { + return stpLogic.isSafe(tokenValue, service); + } + + /** + * 校验:当前会话是否已通过二级认证,如未通过则抛出异常 */ public static void checkSafe() { stpLogic.checkSafe(); } /** - * 获取当前会话的二级认证剩余有效时间 (单位: 秒, 返回-2代表尚未通过二级认证) + * 校验:检查当前会话是否已通过指定业务的二级认证,如未通过则抛出异常 + * + * @param service 业务标识 + */ + public static void checkSafe(String service) { + stpLogic.checkSafe(service); + } + + /** + * 获取:当前会话的二级认证剩余有效时间(单位: 秒, 返回-2代表尚未通过二级认证) + * * @return 剩余有效时间 */ public static long getSafeTime() { return stpLogic.getSafeTime(); } + /** + * 获取:当前会话的二级认证剩余有效时间(单位: 秒, 返回-2代表尚未通过二级认证) + * + * @param service 业务标识 + * @return 剩余有效时间 + */ + public static long getSafeTime(String service) { + return stpLogic.getSafeTime(service); + } + /** * 在当前会话 结束二级认证 */ @@ -848,89 +1409,50 @@ public class StpClientUtil { stpLogic.closeSafe(); } + /** + * 在当前会话 结束指定业务标识的二级认证 + * + * @param service 业务标识 + */ + public static void closeSafe(String service) { + stpLogic.closeSafe(service); + } - // =================== 历史API,兼容旧版本 =================== + + // ------------------- Bean 对象、字段代理 ------------------- /** - *
当对方再次访问系统时,会抛出NotLoginException异常,场景值=-2 - * @param loginId 账号id - */ - @Deprecated - public static void logoutByLoginId(Object loginId) { - stpLogic.kickout(loginId); - } - - /** - *
当对方再次访问系统时,会抛出NotLoginException异常,场景值=-2
- * @param loginId 账号id - * @param device 设备标识 (填null代表所有注销设备) - */ - @Deprecated - public static void logoutByLoginId(Object loginId, String device) { - stpLogic.kickout(loginId, device); + public static String getLoginDeviceByToken(String tokenValue) { + return stpLogic.getLoginDeviceByToken(tokenValue); } } diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/core/config/AuthConfigure.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/core/config/AuthConfigure.java index 957b4362..e88c828b 100644 --- a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/core/config/AuthConfigure.java +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/core/config/AuthConfigure.java @@ -16,7 +16,7 @@ import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.interceptor.SaInterceptor; import cn.dev33.satoken.stp.StpInterface; import cn.dev33.satoken.stp.StpLogic; -import cn.dev33.satoken.strategy.SaStrategy; +import cn.dev33.satoken.strategy.SaAnnotationStrategy; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import jakarta.annotation.Resource; @@ -81,7 +81,7 @@ public class AuthConfigure implements WebMvcConfigurer { @Autowired public void rewriteSaStrategy() { // 重写Sa-Token的注解处理器,增加注解合并功能 - SaStrategy.instance.getAnnotation = AnnotatedElementUtils::getMergedAnnotation; + SaAnnotationStrategy.instance.getAnnotation = AnnotatedElementUtils::getMergedAnnotation; } /** diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/auth/AuthApiProvider.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/auth/AuthApiProvider.java index 3836f2f5..443abd2d 100644 --- a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/auth/AuthApiProvider.java +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/auth/AuthApiProvider.java @@ -47,7 +47,7 @@ public class AuthApiProvider implements AuthApi { JSONObject jsonObject = JSONUtil.createObj(); String userId = StrUtil.split(sessionId, StrUtil.COLON).get(3); SaSession saSession = StpUtil.getSessionByLoginId(userId, false); - int tokenCount = saSession.getTokenSignList().size(); + int tokenCount = saSession.getTerminalList().size(); long createTime = saSession.getCreateTime(); jsonObject.set("userId", userId); jsonObject.set("tokenCount", tokenCount); @@ -59,7 +59,7 @@ public class AuthApiProvider implements AuthApi { JSONObject jsonObject = JSONUtil.createObj(); String userId = StrUtil.split(sessionId, StrUtil.COLON).get(3); SaSession saSession = StpClientUtil.getSessionByLoginId(userId, false); - int tokenCount = saSession.getTokenSignList().size(); + int tokenCount = saSession.getTerminalList().size(); long createTime = saSession.getCreateTime(); jsonObject.set("userId", userId); jsonObject.set("tokenCount", tokenCount); diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/listener/AuthListener.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/listener/AuthListener.java index c5a15827..d38bdd15 100644 --- a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/listener/AuthListener.java +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/listener/AuthListener.java @@ -13,7 +13,7 @@ package vip.xiaonuo.auth.modular.login.listener; import cn.dev33.satoken.listener.SaTokenListener; -import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.parameter.SaLoginParameter; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import jakarta.annotation.Resource; @@ -43,10 +43,10 @@ public class AuthListener implements SaTokenListener { /** 每次登录时触发 */ @Override - public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) { + public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginParameter loginModel) { // 更新用户的登录时间和登录ip等信息 if(SaClientTypeEnum.B.getValue().equals(loginType)) { - loginUserApi.updateUserLoginInfo(Convert.toStr(loginId), loginModel.getDevice()); + loginUserApi.updateUserLoginInfo(Convert.toStr(loginId), loginModel.getDeviceType()); // 记录B端登录日志 Object name = loginModel.getExtra("name"); if(ObjectUtil.isNotEmpty(name)) { @@ -55,7 +55,7 @@ public class AuthListener implements SaTokenListener { devLogApi.executeLoginLog(null); } } else { - clientLoginUserApi.updateUserLoginInfo(Convert.toStr(loginId), loginModel.getDevice()); + clientLoginUserApi.updateUserLoginInfo(Convert.toStr(loginId), loginModel.getDeviceType()); } } @@ -123,7 +123,7 @@ public class AuthListener implements SaTokenListener { /** 每次Token续期时触发 */ @Override - public void doRenewTimeout(String tokenValue, Object loginId, long timeout) { + public void doRenewTimeout(String loginType, Object loginId, String tokenValue, long timeout) { // ... } } diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/service/impl/AuthServiceImpl.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/service/impl/AuthServiceImpl.java index e2bd2b07..19eed328 100644 --- a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/service/impl/AuthServiceImpl.java +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/service/impl/AuthServiceImpl.java @@ -12,8 +12,8 @@ */ package vip.xiaonuo.auth.modular.login.service.impl; -import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.stp.parameter.SaLoginParameter; import cn.hutool.captcha.CaptchaUtil; import cn.hutool.captcha.CircleCaptcha; import cn.hutool.core.collection.CollectionUtil; @@ -751,7 +751,7 @@ public class AuthServiceImpl implements AuthService { throw new CommonException(AuthExceptionEnum.ACCOUNT_DISABLED.getValue()); } // 执行登录 - StpUtil.login(saBaseLoginUser.getId(), new SaLoginModel().setDevice(device).setExtra("name", saBaseLoginUser.getName())); + StpUtil.login(saBaseLoginUser.getId(), new SaLoginParameter().setDeviceType(device).setExtra("name", saBaseLoginUser.getName())); // 填充B端用户信息并更新缓存 fillSaBaseLoginUserAndUpdateCache(saBaseLoginUser); // 返回token @@ -805,7 +805,7 @@ public class AuthServiceImpl implements AuthService { throw new CommonException(AuthExceptionEnum.ACCOUNT_DISABLED.getValue()); } // 执行登录 - StpClientUtil.login(saBaseClientLoginUser.getId(), new SaLoginModel().setDevice(device).setExtra("name", saBaseClientLoginUser.getName())); + StpClientUtil.login(saBaseClientLoginUser.getId(), new SaLoginParameter().setDevice(device).setExtra("name", saBaseClientLoginUser.getName())); // 填充C端用户信息并更新缓存 fillSaBaseClientLoginUserAndUpdateCache(saBaseClientLoginUser); // 返回token diff --git a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/service/impl/AuthSessionServiceImpl.java b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/service/impl/AuthSessionServiceImpl.java index 4a96b3f6..637c8ba4 100644 --- a/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/service/impl/AuthSessionServiceImpl.java +++ b/snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/monitor/service/impl/AuthSessionServiceImpl.java @@ -66,36 +66,36 @@ public class AuthSessionServiceImpl implements AuthSessionService { JSONObject jsonObject = JSONUtil.createObj(); String userId = StrUtil.split(sessionId, StrUtil.COLON).get(3); SaSession saSession = StpUtil.getSessionByLoginId(userId, false); - int tokenCount = saSession.getTokenSignList().size(); + int tokenCount = saSession.getTerminalList().size(); long createTime = saSession.getCreateTime(); jsonObject.set("userId", userId); jsonObject.set("tokenCount", tokenCount); jsonObject.set("createTime", DateTime.of(createTime)); return jsonObject; - }).collect(Collectors.toList()); + }).toList(); List