From e6b9f3c204645f3cf3b003a2473f2e5cf0cf9fae Mon Sep 17 00:00:00 2001 From: Lucas <12836619+creaks@user.noreply.gitee.com> Date: Mon, 5 Jan 2026 14:25:16 +0800 Subject: [PATCH] =?UTF-8?q?StpUtil=20=E4=B8=AD=E9=81=97=E6=BC=8F=E7=9A=84?= =?UTF-8?q?=20static=20=E5=85=B3=E9=94=AE=E5=AD=97=E5=92=8C=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=96=87=E6=A1=A3=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- .../java/cn/dev33/satoken/stp/StpUtil.java | 477 +++++++++--------- .../cn/dev33/satoken/strategy/SaStrategy.java | 53 +- sa-token-doc/arch/dir-intro.md | 2 +- 4 files changed, 275 insertions(+), 261 deletions(-) diff --git a/README.md b/README.md index 4d21b0efb..c8c811ad4 100644 --- a/README.md +++ b/README.md @@ -133,7 +133,7 @@ registry.addInterceptor(new SaInterceptor(handler -> { - **独立Redis** —— 将权限缓存与业务缓存分离。 - **Quick快速登录认证** —— 为项目零代码注入一个登录页面。 - **标签方言** —— 提供 Thymeleaf 标签方言集成包,提供 beetl 集成示例。 -- **jwt集成** —— 提供三种模式的 jwt 集成方案,提供 token 扩展参数能力。 +- **JWT集成** —— 提供三种模式的 JWT 集成方案,提供 token 扩展参数能力。 - **RPC调用状态传递** —— 提供 dubbo、grpc 等集成包,在RPC调用时登录状态不丢失。 - **参数签名** —— 提供跨系统API调用签名校验模块,防参数篡改,防请求重放。 - **自动续签** —— 提供两种Token过期策略,灵活搭配使用,还可自动续签。 @@ -162,7 +162,7 @@ Sa-Token SSO 分为三种模式,解决同域、跨域、共享Redis、跨Redis 3. 如果既无法做到前端同域,也无法做到后端同Redis,可以走模式三,Http请求校验 ticket 获取会话。 4. 提供 NoSdk 模式示例,不使用 Sa-Token 的系统也可以对接。 5. 提供 sso-server 接口文档,不使用 java 语言的系统也可以对接。 -6. 提供前后端分离整合方案:无论是 sso-server 还是 sso-client 的前后端分离都可以整合。 +6. 提供前后端分离整合方案:支持 sso-server 与 sso-client 情况下的各种整合需求。 7. 提供安全校验:域名校验、ticket校验、参数签名校验,有效防 ticket 劫持,防请求重放等攻击。 8. 参数防丢:笔者曾试验多个SSO框架,均有参数丢失情况,比如登录前是:`http://a.com?id=1&name=2`,登录成功后就变成了:`http://a.com?id=1`,Sa-Token-SSO 内有专门算法保证了参数不丢失,登录成功后精准原路返回。 9. 提供用户数据同步/迁移方案的建议:开发前统一迁移、运行时实时数据同步、根据关联字段匹配、根据 center_id 字段匹配等。 diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java index 3dffa941c..cf6f06525 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java @@ -33,14 +33,15 @@ * @since 1.0.0 */ public class StpUtil { - - private StpUtil() {} - + + private StpUtil() { + } + /** * 多账号体系下的类型标识 */ public static final String TYPE = "login"; - + /** * 底层使用的 StpLogic 对象 */ @@ -51,27 +52,30 @@ private StpUtil() {} * * @return / */ - public static String getLoginType(){ + public static String getLoginType() { return stpLogic.getLoginType(); } /** * 安全的重置 StpLogic 对象 * - *
1、更改此账户的 StpLogic 对象 - *
2、put 到全局 StpLogic 集合中 - *
3、发送日志 + *
+ * 1、更改此账户的 StpLogic 对象 + *
+ * 2、put 到全局 StpLogic 集合中 + *
+ * 3、发送日志 * - * @param newStpLogic / + * @param newStpLogic / */ public static void setStpLogic(StpLogic newStpLogic) { // 1、重置此账户的 StpLogic 对象 stpLogic = newStpLogic; - + // 2、添加到全局 StpLogic 集合中 - // 以便可以通过 SaManager.getStpLogic(type) 的方式来全局获取到这个 StpLogic + // 以便可以通过 SaManager.getStpLogic(type) 的方式来全局获取到这个 StpLogic SaManager.putStpLogic(newStpLogic); - + // 3、$$ 发布事件:更新了 stpLogic 对象 SaTokenEventCenter.doSetStpLogic(stpLogic); } @@ -79,50 +83,50 @@ public static void setStpLogic(StpLogic newStpLogic) { /** * 获取 StpLogic 对象 * - * @return / + * @return / */ public static StpLogic getStpLogic() { return stpLogic; } - - + // ------------------- 获取 token 相关 ------------------- /** - * 返回 token 名称,此名称在以下地方体现:Cookie 保存 token 时的名称、提交 token 时参数的名称、存储 token 时的 key 前缀 + * 返回 token 名称,此名称在以下地方体现:Cookie 保存 token 时的名称、提交 token 时参数的名称、存储 token 时的 key + * 前缀 * * @return / */ public static String getTokenName() { - return stpLogic.getTokenName(); - } + return stpLogic.getTokenName(); + } /** * 在当前会话写入指定 token 值 * * @param tokenValue token 值 */ - public static void setTokenValue(String tokenValue){ + public static void setTokenValue(String tokenValue) { stpLogic.setTokenValue(tokenValue); } /** * 在当前会话写入指定 token 值 * - * @param tokenValue 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); } /** * 在当前会话写入指定 token 值 * - * @param tokenValue token 值 + * @param tokenValue token 值 * @param loginParameter 登录参数 */ - public static void setTokenValue(String tokenValue, SaLoginParameter loginParameter){ + public static void setTokenValue(String tokenValue, SaLoginParameter loginParameter) { stpLogic.setTokenValue(tokenValue, loginParameter); } @@ -131,7 +135,7 @@ public static void setTokenValue(String tokenValue, SaLoginParameter loginParame * * @param tokenValue 要保存的 token 值 */ - public static void setTokenValueToStorage(String tokenValue){ + public static void setTokenValueToStorage(String tokenValue) { stpLogic.setTokenValueToStorage(tokenValue); } @@ -147,9 +151,9 @@ public static String getTokenValue() { /** * 获取当前请求的 token 值 (不裁剪前缀) * - * @return / + * @return / */ - public static String getTokenValueNotCut(){ + public static String getTokenValueNotCut() { return stpLogic.getTokenValueNotCut(); } @@ -162,10 +166,9 @@ public static SaTokenInfo getTokenInfo() { return stpLogic.getTokenInfo(); } - // ------------------- 登录相关操作 ------------------- - // --- 登录 + // --- 登录 /** * 会话登录 @@ -179,7 +182,7 @@ public static void login(Object id) { /** * 会话登录,并指定登录设备类型 * - * @param id 账号id,建议的类型:(long | int | String) + * @param id 账号id,建议的类型:(long | int | String) * @param deviceType 设备类型 */ public static void login(Object id, String deviceType) { @@ -189,7 +192,7 @@ public static void login(Object id, String deviceType) { /** * 会话登录,并指定是否 [记住我] * - * @param id 账号id,建议的类型:(long | int | String) + * @param id 账号id,建议的类型:(long | int | String) * @param isLastingCookie 是否为持久Cookie,值为 true 时记住我,值为 false 时关闭浏览器需要重新登录 */ public static void login(Object id, boolean isLastingCookie) { @@ -209,7 +212,7 @@ public static void login(Object id, long timeout) { /** * 会话登录,并指定所有登录参数 Model * - * @param id 账号id,建议的类型:(long | int | String) + * @param id 账号id,建议的类型:(long | int | String) * @param loginParameter 此次登录的参数Model */ public static void login(Object id, SaLoginParameter loginParameter) { @@ -229,8 +232,8 @@ public static String createLoginSession(Object id) { /** * 创建指定账号 id 的登录会话数据 * - * @param id 账号id,建议的类型:(long | int | String) - * @param loginParameter 此次登录的参数Model + * @param id 账号id,建议的类型:(long | int | String) + * @param loginParameter 此次登录的参数Model * @return 返回会话令牌 */ public static String createLoginSession(Object id, SaLoginParameter loginParameter) { @@ -275,7 +278,7 @@ public static void logoutByTokenValue(String tokenValue) { /** * 注销下线,根据指定 token、注销参数 * - * @param tokenValue 指定 token + * @param tokenValue 指定 token * @param logoutParameter / */ public static void logoutByTokenValue(String tokenValue, SaLogoutParameter logoutParameter) { @@ -284,7 +287,9 @@ public static void logoutByTokenValue(String tokenValue, SaLogoutParameter logou /** * 踢人下线,根据指定 token - *

当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5

+ *

+ * 当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5 + *

* * @param tokenValue 指定 token */ @@ -294,9 +299,11 @@ public static void kickoutByTokenValue(String tokenValue) { /** * 踢人下线,根据指定 token、注销参数 - *

当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5

+ *

+ * 当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5 + *

* - * @param tokenValue 指定 token + * @param tokenValue 指定 token * @param logoutParameter 注销参数 */ public static void kickoutByTokenValue(String tokenValue, SaLogoutParameter logoutParameter) { @@ -305,7 +312,9 @@ public static void kickoutByTokenValue(String tokenValue, SaLogoutParameter logo /** * 顶人下线,根据指定 token - *

当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-4

+ *

+ * 当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-4 + *

* * @param tokenValue 指定 token */ @@ -315,9 +324,11 @@ public static void replacedByTokenValue(String tokenValue) { /** * 顶人下线,根据指定 token、注销参数 - *

当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-4

+ *

+ * 当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-4 + *

* - * @param tokenValue 指定 token + * @param tokenValue 指定 token * @param logoutParameter / */ public static void replacedByTokenValue(String tokenValue, SaLogoutParameter logoutParameter) { @@ -338,7 +349,7 @@ public static void logout(Object loginId) { /** * 会话注销,根据账号id 和 设备类型 * - * @param loginId 账号id + * @param loginId 账号id * @param deviceType 设备类型 (填 null 代表注销该账号的所有设备类型) */ public static void logout(Object loginId, String deviceType) { @@ -348,7 +359,7 @@ public static void logout(Object loginId, String deviceType) { /** * 会话注销,根据账号id 和 注销参数 * - * @param loginId 账号id + * @param loginId 账号id * @param logoutParameter 注销参数 */ public static void logout(Object loginId, SaLogoutParameter logoutParameter) { @@ -357,7 +368,9 @@ public static void logout(Object loginId, SaLogoutParameter logoutParameter) { /** * 踢人下线,根据账号id - *

当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5

+ *

+ * 当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5 + *

* * @param loginId 账号id */ @@ -367,9 +380,11 @@ public static void kickout(Object loginId) { /** * 踢人下线,根据账号id 和 设备类型 - *

当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5

+ *

+ * 当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5 + *

* - * @param loginId 账号id + * @param loginId 账号id * @param deviceType 设备类型 (填 null 代表踢出该账号的所有设备类型) */ public static void kickout(Object loginId, String deviceType) { @@ -378,9 +393,11 @@ public static void kickout(Object loginId, String deviceType) { /** * 踢人下线,根据账号id 和 注销参数 - *

当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5

+ *

+ * 当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5 + *

* - * @param loginId 账号id + * @param loginId 账号id * @param logoutParameter 注销参数 */ public static void kickout(Object loginId, SaLogoutParameter logoutParameter) { @@ -389,7 +406,9 @@ public static void kickout(Object loginId, SaLogoutParameter logoutParameter) { /** * 顶人下线,根据账号id - *

当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-4

+ *

+ * 当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-4 + *

* * @param loginId 账号id */ @@ -399,9 +418,11 @@ public static void replaced(Object loginId) { /** * 顶人下线,根据账号id 和 设备类型 - *

当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-4

+ *

+ * 当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-4 + *

* - * @param loginId 账号id + * @param loginId 账号id * @param deviceType 设备类型 (填 null 代表顶替该账号的所有设备类型) */ public static void replaced(Object loginId, String deviceType) { @@ -410,9 +431,11 @@ public static void replaced(Object loginId, String deviceType) { /** * 顶人下线,根据账号id 和 注销参数 - *

当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-4

+ *

+ * 当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-4 + *

* - * @param loginId 账号id + * @param loginId 账号id * @param logoutParameter 注销参数 */ public static void replaced(Object loginId, SaLogoutParameter logoutParameter) { @@ -423,7 +446,8 @@ public static void replaced(Object loginId, SaLogoutParameter logoutParameter) { /** * 在 Account-Session 上移除 Terminal 信息 (注销下线方式) - * @param session / + * + * @param session / * @param terminal / */ public static void removeTerminalByLogout(SaSession session, SaTerminalInfo terminal) { @@ -432,7 +456,8 @@ public static void removeTerminalByLogout(SaSession session, SaTerminalInfo term /** * 在 Account-Session 上移除 Terminal 信息 (踢人下线方式) - * @param session / + * + * @param session / * @param terminal / */ public static void removeTerminalByKickout(SaSession session, SaTerminalInfo terminal) { @@ -441,14 +466,14 @@ public static void removeTerminalByKickout(SaSession session, SaTerminalInfo ter /** * 在 Account-Session 上移除 Terminal 信息 (顶人下线方式) - * @param session / + * + * @param session / * @param terminal / */ public static void removeTerminalByReplaced(SaSession session, SaTerminalInfo terminal) { stpLogic.removeTerminalByReplaced(session, terminal); } - // 会话查询 /** @@ -472,9 +497,9 @@ public static boolean isLogin(Object loginId) { /** * 检验当前会话是否已经登录,如未登录,则抛出异常 */ - public static void checkLogin() { - stpLogic.checkLogin(); - } + public static void checkLogin() { + stpLogic.checkLogin(); + } /** * 获取当前会话账号id,如果未登录,则抛出异常 @@ -488,7 +513,7 @@ public static Object getLoginId() { /** * 获取当前会话账号id, 如果未登录,则返回默认值 * - * @param 返回类型 + * @param 返回类型 * @param defaultValue 默认值 * @return 登录id */ @@ -503,7 +528,7 @@ public static T getLoginId(T defaultValue) { */ public static Object getLoginIdDefaultNull() { return stpLogic.getLoginIdDefaultNull(); - } + } /** * 获取当前会话账号id, 并转换为 String 类型 @@ -538,9 +563,9 @@ public static long getLoginIdAsLong() { * @param tokenValue token * @return 账号id */ - public static Object getLoginIdByToken(String tokenValue) { - return stpLogic.getLoginIdByToken(tokenValue); - } + public static Object getLoginIdByToken(String tokenValue) { + return stpLogic.getLoginIdByToken(tokenValue); + } /** * 获取指定 token 对应的账号id,如果 token 无效或 token 处于被踢、被顶等状态 (不考虑被冻结),则返回 null @@ -548,14 +573,14 @@ public static Object getLoginIdByToken(String tokenValue) { * @param tokenValue token * @return 账号id */ - public Object getLoginIdByTokenNotThinkFreeze(String tokenValue) { + public static Object getLoginIdByTokenNotThinkFreeze(String tokenValue) { return stpLogic.getLoginIdByTokenNotThinkFreeze(tokenValue); } /** * 获取当前 Token 的扩展信息(此函数只在jwt模式下生效) * - * @param key 键值 + * @param key 键值 * @return 对应的扩展数据 */ public static Object getExtra(String key) { @@ -566,20 +591,19 @@ public static Object getExtra(String key) { * 获取指定 Token 的扩展信息(此函数只在jwt模式下生效) * * @param tokenValue 指定的 Token 值 - * @param key 键值 + * @param key 键值 * @return 对应的扩展数据 */ public static Object getExtra(String tokenValue, String key) { return stpLogic.getExtra(tokenValue, key); } - - + // ------------------- Account-Session 相关 ------------------- /** * 获取指定账号 id 的 Account-Session, 如果该 SaSession 尚未创建,isCreate=是否新建并返回 * - * @param loginId 账号id + * @param loginId 账号id * @param isCreate 是否新建 * @return SaSession 对象 */ @@ -610,7 +634,7 @@ public static SaSession getSessionByLoginId(Object loginId) { /** * 获取当前已登录账号的 Account-Session, 如果该 SaSession 尚未创建,isCreate=是否新建并返回 * - * @param isCreate 是否新建 + * @param isCreate 是否新建 * @return Session对象 */ public static SaSession getSession(boolean isCreate) { @@ -626,8 +650,7 @@ public static SaSession getSession() { return stpLogic.getSession(); } - - // ------------------- Token-Session 相关 ------------------- + // ------------------- Token-Session 相关 ------------------- /** * 获取指定 token 的 Token-Session,如果该 SaSession 尚未创建,则新建并返回 @@ -656,15 +679,14 @@ public static SaSession getTokenSession() { public static SaSession getAnonTokenSession() { return stpLogic.getAnonTokenSession(); } - // ------------------- Active-Timeout token 最低活跃度 验证相关 ------------------- /** * 续签当前 token:(将 [最后操作时间] 更新为当前时间戳) *

- * 请注意: 即使 token 已被冻结 也可续签成功, - * 如果此场景下需要提示续签失败,可在此之前调用 checkActiveTimeout() 强制检查是否冻结即可 + * 请注意: 即使 token 已被冻结 也可续签成功, + * 如果此场景下需要提示续签失败,可在此之前调用 checkActiveTimeout() 强制检查是否冻结即可 *

*/ public static void updateLastActiveToNow() { @@ -674,9 +696,9 @@ public static void updateLastActiveToNow() { /** * 检查当前 token 是否已被冻结,如果是则抛出异常 */ - public static void checkActiveTimeout() { - stpLogic.checkActiveTimeout(); - } + public static void checkActiveTimeout() { + stpLogic.checkActiveTimeout(); + } /** * 获取当前 token 的最后活跃时间(13位时间戳),如果不存在则返回 -2 @@ -687,17 +709,16 @@ public static long getTokenLastActiveTime() { return stpLogic.getTokenLastActiveTime(); } - - // ------------------- 过期时间相关 ------------------- + // ------------------- 过期时间相关 ------------------- /** * 获取当前会话 token 剩余有效时间(单位: 秒,返回 -1 代表永久有效,-2 代表没有这个值) * * @return token剩余有效时间 */ - public static long getTokenTimeout() { - return stpLogic.getTokenTimeout(); - } + public static long getTokenTimeout() { + return stpLogic.getTokenTimeout(); + } /** * 获取指定 token 剩余有效时间(单位: 秒,返回 -1 代表永久有效,-2 代表没有这个值) @@ -714,48 +735,48 @@ public static long getTokenTimeout(String token) { * * @return token剩余有效时间 */ - public static long getSessionTimeout() { - return stpLogic.getSessionTimeout(); - } + public static long getSessionTimeout() { + return stpLogic.getSessionTimeout(); + } /** * 获取当前 token 的 Token-Session 剩余有效时间(单位: 秒,返回 -1 代表永久有效,-2 代表没有这个值) * * @return token剩余有效时间 */ - public static long getTokenSessionTimeout() { - return stpLogic.getTokenSessionTimeout(); - } + public static long getTokenSessionTimeout() { + return stpLogic.getTokenSessionTimeout(); + } /** - * 获取当前 token 剩余活跃有效期:当前 token 距离被冻结还剩多少时间(单位: 秒,返回 -1 代表永不冻结,-2 代表没有这个值或 token 已被冻结了) + * 获取当前 token 剩余活跃有效期:当前 token 距离被冻结还剩多少时间(单位: 秒,返回 -1 代表永不冻结,-2 代表没有这个值或 token + * 已被冻结了) * * @return / */ - public static long getTokenActiveTimeout() { - return stpLogic.getTokenActiveTimeout(); - } + public static long getTokenActiveTimeout() { + return stpLogic.getTokenActiveTimeout(); + } /** * 对当前 token 的 timeout 值进行续期 * * @param timeout 要修改成为的有效时间 (单位: 秒) */ - public static void renewTimeout(long timeout) { - stpLogic.renewTimeout(timeout); - } + public static void renewTimeout(long timeout) { + stpLogic.renewTimeout(timeout); + } /** * 对指定 token 的 timeout 值进行续期 * * @param tokenValue 指定 token - * @param timeout 要修改成为的有效时间 (单位: 秒,填 -1 代表要续为永久有效) + * @param timeout 要修改成为的有效时间 (单位: 秒,填 -1 代表要续为永久有效) */ - public static void renewTimeout(String tokenValue, long timeout) { - stpLogic.renewTimeout(tokenValue, timeout); - } - - + public static void renewTimeout(String tokenValue, long timeout) { + stpLogic.renewTimeout(tokenValue, timeout); + } + // ------------------- 角色认证操作 ------------------- /** @@ -770,7 +791,7 @@ public static List getRoleList() { /** * 获取:指定账号的角色集合 * - * @param loginId 指定账号id + * @param loginId 指定账号id * @return / */ public static List getRoleList(Object loginId) { @@ -783,20 +804,20 @@ public static List getRoleList(Object loginId) { * @param role 角色 * @return / */ - public static boolean hasRole(String role) { - return stpLogic.hasRole(role); - } + public static boolean hasRole(String role) { + return stpLogic.hasRole(role); + } /** * 判断:指定账号是否含有指定角色标识, 返回 true 或 false * * @param loginId 账号id - * @param role 角色标识 + * @param role 角色标识 * @return 是否含有指定角色标识 */ - public static boolean hasRole(Object loginId, String role) { - return stpLogic.hasRole(loginId, role); - } + public static boolean hasRole(Object loginId, String role) { + return stpLogic.hasRole(loginId, role); + } /** * 判断:当前账号是否含有指定角色标识 [ 指定多个,必须全部验证通过 ] @@ -804,9 +825,9 @@ public static boolean hasRole(Object loginId, String role) { * @param roleArray 角色标识数组 * @return true或false */ - public static boolean hasRoleAnd(String... roleArray){ - return stpLogic.hasRoleAnd(roleArray); - } + public static boolean hasRoleAnd(String... roleArray) { + return stpLogic.hasRoleAnd(roleArray); + } /** * 判断:当前账号是否含有指定角色标识 [ 指定多个,只要其一验证通过即可 ] @@ -814,44 +835,43 @@ public static boolean hasRoleAnd(String... roleArray){ * @param roleArray 角色标识数组 * @return true或false */ - public static boolean hasRoleOr(String... roleArray){ - return stpLogic.hasRoleOr(roleArray); - } + public static boolean hasRoleOr(String... roleArray) { + return stpLogic.hasRoleOr(roleArray); + } /** * 校验:当前账号是否含有指定角色标识, 如果验证未通过,则抛出异常: NotRoleException * * @param role 角色标识 */ - public static void checkRole(String role) { - stpLogic.checkRole(role); - } + public static void checkRole(String role) { + stpLogic.checkRole(role); + } /** * 校验:当前账号是否含有指定角色标识 [ 指定多个,必须全部验证通过 ] * * @param roleArray 角色标识数组 */ - public static void checkRoleAnd(String... roleArray){ - stpLogic.checkRoleAnd(roleArray); - } + public static void checkRoleAnd(String... roleArray) { + stpLogic.checkRoleAnd(roleArray); + } /** * 校验:当前账号是否含有指定角色标识 [ 指定多个,只要其一验证通过即可 ] * * @param roleArray 角色标识数组 */ - public static void checkRoleOr(String... roleArray){ - stpLogic.checkRoleOr(roleArray); - } + public static void checkRoleOr(String... roleArray) { + stpLogic.checkRoleOr(roleArray); + } - // ------------------- 权限认证操作 ------------------- /** * 获取:当前账号的权限码集合 * - * @return / + * @return / */ public static List getPermissionList() { return stpLogic.getPermissionList(); @@ -861,7 +881,7 @@ public static List getPermissionList() { * 获取:指定账号的权限码集合 * * @param loginId 指定账号id - * @return / + * @return / */ public static List getPermissionList(Object loginId) { return stpLogic.getPermissionList(loginId); @@ -880,7 +900,7 @@ public static boolean hasPermission(String permission) { /** * 判断:指定账号 id 是否含有指定权限, 返回 true 或 false * - * @param loginId 账号 id + * @param loginId 账号 id * @param permission 权限码 * @return 是否含有指定权限 */ @@ -894,9 +914,9 @@ public static boolean hasPermission(Object loginId, String permission) { * @param permissionArray 权限码数组 * @return true 或 false */ - public static boolean hasPermissionAnd(String... permissionArray){ - return stpLogic.hasPermissionAnd(permissionArray); - } + public static boolean hasPermissionAnd(String... permissionArray) { + return stpLogic.hasPermissionAnd(permissionArray); + } /** * 判断:当前账号是否含有指定权限 [ 指定多个,只要其一验证通过即可 ] @@ -904,9 +924,9 @@ public static boolean hasPermissionAnd(String... permissionArray){ * @param permissionArray 权限码数组 * @return true 或 false */ - public static boolean hasPermissionOr(String... permissionArray){ - return stpLogic.hasPermissionOr(permissionArray); - } + public static boolean hasPermissionOr(String... permissionArray) { + return stpLogic.hasPermissionOr(permissionArray); + } /** * 校验:当前账号是否含有指定权限, 如果验证未通过,则抛出异常: NotPermissionException @@ -935,14 +955,13 @@ public static void checkPermissionOr(String... permissionArray) { stpLogic.checkPermissionOr(permissionArray); } - // ------------------- id 反查 token 相关操作 ------------------- /** * 获取指定账号 id 的 token *

- * 在配置为允许并发登录时,此方法只会返回队列的最后一个 token, - * 如果你需要返回此账号 id 的所有 token,请调用 getTokenValueListByLoginId + * 在配置为允许并发登录时,此方法只会返回队列的最后一个 token, + * 如果你需要返回此账号 id 的所有 token,请调用 getTokenValueListByLoginId *

* * @param loginId 账号id @@ -955,11 +974,11 @@ public static String getTokenValueByLoginId(Object loginId) { /** * 获取指定账号 id 指定设备类型端的 token *

- * 在配置为允许并发登录时,此方法只会返回队列的最后一个 token, - * 如果你需要返回此账号 id 的所有 token,请调用 getTokenValueListByLoginId + * 在配置为允许并发登录时,此方法只会返回队列的最后一个 token, + * 如果你需要返回此账号 id 的所有 token,请调用 getTokenValueListByLoginId *

* - * @param loginId 账号id + * @param loginId 账号id * @param deviceType 设备类型,填 null 代表不限设备类型 * @return token值 */ @@ -980,7 +999,7 @@ public static List getTokenValueListByLoginId(Object loginId) { /** * 获取指定账号 id 指定设备类型端的 token 集合 * - * @param loginId 账号id + * @param loginId 账号id * @param deviceType 设备类型,填 null 代表不限设备类型 * @return 此 loginId 的所有登录 token */ @@ -1001,7 +1020,7 @@ public static List getTerminalListByLoginId(Object loginId) { /** * 获取指定账号 id 指定设备类型端的已登录设备信息集合 * - * @param loginId 账号id + * @param loginId 账号id * @param deviceType 设备类型,填 null 代表不限设备类型 * @return / */ @@ -1012,7 +1031,7 @@ public static List getTerminalListByLoginId(Object loginId, Stri /** * 获取指定账号 id 已登录设备信息集合,执行特定函数 * - * @param loginId 账号id + * @param loginId 账号id * @param function 需要执行的函数 */ public static void forEachTerminalList(Object loginId, SaTwoParamFunction function) { @@ -1078,6 +1097,7 @@ public static String getLoginDeviceIdByToken(String tokenValue) { /** * 判断对于指定 loginId 来讲,指定设备 id 是否为可信任设备 + * * @param deviceId / * @return / */ @@ -1085,16 +1105,14 @@ public static boolean isTrustDeviceId(Object userId, String deviceId) { return stpLogic.isTrustDeviceId(userId, deviceId); } - - - // ------------------- 会话管理 ------------------- + // ------------------- 会话管理 ------------------- /** * 根据条件查询缓存中所有的 token * - * @param keyword 关键字 - * @param start 开始处索引 - * @param size 获取数量 (-1代表一直获取到末尾) + * @param keyword 关键字 + * @param start 开始处索引 + * @param size 获取数量 (-1代表一直获取到末尾) * @param sortType 排序类型(true=正序,false=反序) * * @return token集合 @@ -1106,9 +1124,9 @@ public static List searchTokenValue(String keyword, int start, int size, /** * 根据条件查询缓存中所有的 SessionId * - * @param keyword 关键字 - * @param start 开始处索引 - * @param size 获取数量 (-1代表一直获取到末尾) + * @param keyword 关键字 + * @param start 开始处索引 + * @param size 获取数量 (-1代表一直获取到末尾) * @param sortType 排序类型(true=正序,false=反序) * * @return sessionId集合 @@ -1120,9 +1138,9 @@ public static List searchSessionId(String keyword, int start, int size, /** * 根据条件查询缓存中所有的 Token-Session-Id * - * @param keyword 关键字 - * @param start 开始处索引 - * @param size 获取数量 (-1代表一直获取到末尾) + * @param keyword 关键字 + * @param start 开始处索引 + * @param size 获取数量 (-1代表一直获取到末尾) * @param sortType 排序类型(true=正序,false=反序) * * @return sessionId集合 @@ -1131,25 +1149,25 @@ public static List searchTokenSessionId(String keyword, int start, int s return stpLogic.searchTokenSessionId(keyword, start, size, sortType); } - - // ------------------- 账号封禁 ------------------- + // ------------------- 账号封禁 ------------------- /** * 封禁:指定账号 - *

此方法不会直接将此账号id踢下线,如需封禁后立即掉线,请追加调用 StpUtil.logout(id) + *

+ * 此方法不会直接将此账号id踢下线,如需封禁后立即掉线,请追加调用 StpUtil.logout(id) * - * @param loginId 指定账号id - * @param time 封禁时间, 单位: 秒 (-1=永久封禁) + * @param loginId 指定账号id + * @param time 封禁时间, 单位: 秒 (-1=永久封禁) */ public static void disable(Object loginId, long time) { stpLogic.disable(loginId, time); } /** - * 判断:指定账号是否已被封禁 (true=已被封禁, false=未被封禁) + * 判断:指定账号是否已被封禁 (true=已被封禁, false=未被封禁) * * @param loginId 账号id - * @return / + * @return / */ public static boolean isDisable(Object loginId) { return stpLogic.isDisable(loginId); @@ -1168,7 +1186,7 @@ public static void checkDisable(Object loginId) { * 获取:指定账号剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁) * * @param loginId 账号id - * @return / + * @return / */ public static long getDisableTime(Object loginId) { return stpLogic.getDisableTime(loginId); @@ -1183,16 +1201,16 @@ public static void untieDisable(Object loginId) { stpLogic.untieDisable(loginId); } - - // ------------------- 分类封禁 ------------------- + // ------------------- 分类封禁 ------------------- /** - * 封禁:指定账号的指定服务 - *

此方法不会直接将此账号id踢下线,如需封禁后立即掉线,请追加调用 StpUtil.logout(id) + * 封禁:指定账号的指定服务 + *

+ * 此方法不会直接将此账号id踢下线,如需封禁后立即掉线,请追加调用 StpUtil.logout(id) * * @param loginId 指定账号id - * @param service 指定服务 - * @param time 封禁时间, 单位: 秒 (-1=永久封禁) + * @param service 指定服务 + * @param time 封禁时间, 单位: 秒 (-1=永久封禁) */ public static void disable(Object loginId, String service, long time) { stpLogic.disable(loginId, service, time); @@ -1202,8 +1220,8 @@ public static void disable(Object loginId, String service, long time) { * 判断:指定账号的指定服务 是否已被封禁(true=已被封禁, false=未被封禁) * * @param loginId 账号id - * @param service 指定服务 - * @return / + * @param service 指定服务 + * @return / */ public static boolean isDisable(Object loginId, String service) { return stpLogic.isDisable(loginId, service); @@ -1212,8 +1230,8 @@ public static boolean isDisable(Object loginId, String service) { /** * 校验:指定账号 指定服务 是否已被封禁,如果被封禁则抛出异常 * - * @param loginId 账号id - * @param services 指定服务,可以指定多个 + * @param loginId 账号id + * @param services 指定服务,可以指定多个 */ public static void checkDisable(Object loginId, String... services) { stpLogic.checkDisable(loginId, services); @@ -1223,8 +1241,8 @@ public static void checkDisable(Object loginId, String... services) { * 获取:指定账号 指定服务 剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁) * * @param loginId 账号id - * @param service 指定服务 - * @return see note + * @param service 指定服务 + * @return see note */ public static long getDisableTime(Object loginId, String service) { return stpLogic.getDisableTime(loginId, service); @@ -1233,22 +1251,21 @@ public static long getDisableTime(Object loginId, String service) { /** * 解封:指定账号、指定服务 * - * @param loginId 账号id - * @param services 指定服务,可以指定多个 + * @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=永久封禁) + * @param loginId 指定账号id + * @param level 指定封禁等级 + * @param time 封禁时间, 单位: 秒 (-1=永久封禁) */ public static void disableLevel(Object loginId, int level, long time) { stpLogic.disableLevel(loginId, level, time); @@ -1257,10 +1274,10 @@ public static void disableLevel(Object loginId, int level, long time) { /** * 封禁:指定账号的指定服务,并指定封禁等级 * - * @param loginId 指定账号id - * @param service 指定封禁服务 - * @param level 指定封禁等级 - * @param time 封禁时间, 单位: 秒 (-1=永久封禁) + * @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); @@ -1269,21 +1286,21 @@ public static void disableLevel(Object loginId, String service, int level, long /** * 判断:指定账号是否已被封禁到指定等级 * - * @param loginId 指定账号id - * @param level 指定封禁等级 - * @return / + * @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 / + * @param loginId 指定账号id + * @param service 指定封禁服务 + * @param level 指定封禁等级 + * @return / */ public static boolean isDisableLevel(Object loginId, String service, int level) { return stpLogic.isDisableLevel(loginId, service, level); @@ -1292,8 +1309,8 @@ public static boolean isDisableLevel(Object loginId, String service, int level) /** * 校验:指定账号是否已被封禁到指定等级(如果已经达到,则抛出异常) * - * @param loginId 指定账号id - * @param level 封禁等级 (只有 封禁等级 ≥ 此值 才会抛出异常) + * @param loginId 指定账号id + * @param level 封禁等级 (只有 封禁等级 ≥ 此值 才会抛出异常) */ public static void checkDisableLevel(Object loginId, int level) { stpLogic.checkDisableLevel(loginId, level); @@ -1302,42 +1319,41 @@ public static void checkDisableLevel(Object loginId, int level) { /** * 校验:指定账号的指定服务,是否已被封禁到指定等级(如果已经达到,则抛出异常) * - * @param loginId 指定账号id - * @param service 指定封禁服务 - * @param level 封禁等级 (只有 封禁等级 ≥ 此值 才会抛出异常) + * @param loginId 指定账号id + * @param service 指定封禁服务 + * @param level 封禁等级 (只有 封禁等级 ≥ 此值 才会抛出异常) */ public static void checkDisableLevel(Object loginId, String service, int level) { stpLogic.checkDisableLevel(loginId, service, level); } /** - * 获取:指定账号被封禁的等级,如果未被封禁则返回-2 + * 获取:指定账号被封禁的等级,如果未被封禁则返回-2 * - * @param loginId 指定账号id - * @return / + * @param loginId 指定账号id + * @return / */ public static int getDisableLevel(Object loginId) { return stpLogic.getDisableLevel(loginId); } /** - * 获取:指定账号的 指定服务 被封禁的等级,如果未被封禁则返回-2 + * 获取:指定账号的 指定服务 被封禁的等级,如果未被封禁则返回-2 * - * @param loginId 指定账号id - * @param service 指定封禁服务 - * @return / + * @param loginId 指定账号id + * @param service 指定封禁服务 + * @return / */ public static int getDisableLevel(Object loginId, String service) { return stpLogic.getDisableLevel(loginId, service); } - - + // ------------------- 临时身份切换 ------------------- /** * 临时切换身份为指定账号id * - * @param loginId 指定loginId + * @param loginId 指定loginId */ public static void switchTo(Object loginId) { stpLogic.switchTo(loginId); @@ -1362,20 +1378,19 @@ public static boolean isSwitch() { /** * 在一个 lambda 代码段里,临时切换身份为指定账号id,lambda 结束后自动恢复 * - * @param loginId 指定账号id - * @param function 要执行的方法 + * @param loginId 指定账号id + * @param function 要执行的方法 */ public static void switchTo(Object loginId, SaFunction function) { stpLogic.switchTo(loginId, function); } - - // ------------------- 二级认证 ------------------- + // ------------------- 二级认证 ------------------- /** * 在当前会话 开启二级认证 * - * @param safeTime 维持时间 (单位: 秒) + * @param safeTime 维持时间 (单位: 秒) */ public static void openSafe(long safeTime) { stpLogic.openSafe(safeTime); @@ -1384,8 +1399,8 @@ public static void openSafe(long safeTime) { /** * 在当前会话 开启二级认证 * - * @param service 业务标识 - * @param safeTime 维持时间 (单位: 秒) + * @param service 业务标识 + * @param safeTime 维持时间 (单位: 秒) */ public static void openSafe(String service, long safeTime) { stpLogic.openSafe(service, safeTime); @@ -1394,7 +1409,7 @@ public static void openSafe(String service, long safeTime) { /** * 判断:当前会话是否处于二级认证时间内 * - * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时 + * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时 */ public static boolean isSafe() { return stpLogic.isSafe(); @@ -1403,8 +1418,8 @@ public static boolean isSafe() { /** * 判断:当前会话 是否处于指定业务的二级认证时间内 * - * @param service 业务标识 - * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时 + * @param service 业务标识 + * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时 */ public static boolean isSafe(String service) { return stpLogic.isSafe(service); @@ -1413,9 +1428,9 @@ public static boolean isSafe(String service) { /** * 判断:指定 token 是否处于二级认证时间内 * - * @param tokenValue Token 值 - * @param service 业务标识 - * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时 + * @param tokenValue Token 值 + * @param service 业务标识 + * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时 */ public static boolean isSafe(String tokenValue, String service) { return stpLogic.isSafe(tokenValue, service); @@ -1431,7 +1446,7 @@ public static void checkSafe() { /** * 校验:检查当前会话是否已通过指定业务的二级认证,如未通过则抛出异常 * - * @param service 业务标识 + * @param service 业务标识 */ public static void checkSafe(String service) { stpLogic.checkSafe(service); @@ -1449,7 +1464,7 @@ public static long getSafeTime() { /** * 获取:当前会话的二级认证剩余有效时间(单位: 秒, 返回-2代表尚未通过二级认证) * - * @param service 业务标识 + * @param service 业务标识 * @return 剩余有效时间 */ public static long getSafeTime(String service) { @@ -1457,7 +1472,7 @@ public static long getSafeTime(String service) { } /** - * 在当前会话 结束二级认证 + * 在当前会话 结束二级认证 */ public static void closeSafe() { stpLogic.closeSafe(); @@ -1466,13 +1481,12 @@ public static void closeSafe() { /** * 在当前会话 结束指定业务标识的二级认证 * - * @param service 业务标识 + * @param service 业务标识 */ public static void closeSafe(String service) { stpLogic.closeSafe(service); } - // ------------------- Bean 对象、字段代理 ------------------- /** @@ -1484,11 +1498,10 @@ public static SaLoginParameter createSaLoginParameter() { return stpLogic.createSaLoginParameter(); } - // ------------------- 过期方法 ------------------- /** - *

请更换为 getLoginDeviceType

+ *

请更换为 getLoginDeviceType

* 返回当前会话的登录设备类型 * * @return 当前令牌的登录设备类型 @@ -1499,7 +1512,7 @@ public static String getLoginDevice() { } /** - *

请更换为 getLoginDeviceTypeByToken

+ *

请更换为 getLoginDeviceTypeByToken

* 返回指定 token 会话的登录设备类型 * * @param tokenValue 指定token diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/strategy/SaStrategy.java b/sa-token-core/src/main/java/cn/dev33/satoken/strategy/SaStrategy.java index 6a18c519f..52e7887c5 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/strategy/SaStrategy.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/strategy/SaStrategy.java @@ -32,12 +32,13 @@ *

* 此类统一定义框架内的一些关键性逻辑算法,方便开发者进行按需重写,例: *

+ * *
- // SaStrategy全局单例,所有方法都用以下形式重写
- SaStrategy.instance.setCreateToken((loginId, loginType) -》 {
- // 自定义Token生成的算法
- return "xxxx";
- });
+ * // SaStrategy全局单例,所有方法都用以下形式重写
+ * SaStrategy.instance.setCreateToken((loginId, loginType) -> {
+ * 	// 自定义Token生成的算法
+ * 	return "xxxx";
+ * });
  * 
* * @author click33 @@ -53,7 +54,6 @@ private SaStrategy() { */ public static final SaStrategy instance = new SaStrategy(); - // ----------------------- 所有策略 /** @@ -86,7 +86,8 @@ private SaStrategy() { // tik风格 (2_14_16) case SaTokenConsts.TOKEN_STYLE_TIK: - return SaFoxUtil.getRandomString(2) + "_" + SaFoxUtil.getRandomString(14) + "_" + SaFoxUtil.getRandomString(16) + "__"; + return SaFoxUtil.getRandomString(2) + "_" + SaFoxUtil.getRandomString(14) + "_" + + SaFoxUtil.getRandomString(16) + "__"; // 默认,还是uuid default: @@ -114,7 +115,7 @@ private SaStrategy() { public SaHasElementFunction hasElement = (list, element) -> { // 空集合直接返回false - if(list == null || list.size() == 0) { + if (list == null || list.size() == 0) { return false; } @@ -125,7 +126,7 @@ private SaStrategy() { // 开始模糊匹配 for (String patt : list) { - if(SaFoxUtil.vagueMatch(patt, element)) { + if (SaFoxUtil.vagueMatch(patt, element)) { return true; } } @@ -137,12 +138,13 @@ private SaStrategy() { /** * 生成唯一式 token 的算法 */ - public SaGenerateUniqueTokenFunction generateUniqueToken = (elementName, maxTryTimes, createTokenFunction, checkTokenFunction) -> { + public SaGenerateUniqueTokenFunction generateUniqueToken = (elementName, maxTryTimes, createTokenFunction, + checkTokenFunction) -> { // 为方便叙述,以下代码注释均假设在处理生成 token 的场景,但实际上本方法也可能被用于生成 code、ticket 等 // 循环生成 - for (int i = 1; ; i++) { + for (int i = 1;; i++) { // 生成 token String token = createTokenFunction.get(); @@ -164,11 +166,11 @@ private SaStrategy() { }; /** - * 是否自动续期 active-timeout - */ - public SaAutoRenewFunction autoRenew = (stpLogic) -> { - return stpLogic.getConfigOrGlobal().getAutoRenew(); - }; + * 是否自动续期 active-timeout + */ + public SaAutoRenewFunction autoRenew = (stpLogic) -> { + return stpLogic.getConfigOrGlobal().getAutoRenew(); + }; /** * 创建 StpLogic 的算法 @@ -191,7 +193,6 @@ private SaStrategy() { }; - // ----------------------- 重写策略 set连缀风格 /** @@ -250,15 +251,15 @@ public SaStrategy setCreateStpLogic(SaCreateStpLogicFunction createStpLogic) { } /** - * 是否自动续期 - * - * @param autoRenew / - * @return / - */ - public SaStrategy setAutoRenew(SaAutoRenewFunction autoRenew) { - this.autoRenew = autoRenew; - return this; - } + * 是否自动续期 + * + * @param autoRenew / + * @return / + */ + public SaStrategy setAutoRenew(SaAutoRenewFunction autoRenew) { + this.autoRenew = autoRenew; + return this; + } // diff --git a/sa-token-doc/arch/dir-intro.md b/sa-token-doc/arch/dir-intro.md index 187794155..33ff8a67a 100644 --- a/sa-token-doc/arch/dir-intro.md +++ b/sa-token-doc/arch/dir-intro.md @@ -104,7 +104,7 @@ ├── page_project // [示例] Sa-Token 实现 [ 记住我 ] 模式、前端页面 ├── sa-token-demo-remember-me-server // [示例] Sa-Token 实现 [ 记住我 ] 模式、后端接口 ├── sa-token-demo-solon // [示例] Sa-Token 集成 Solon - ├── sa-token-demo-solon-reisson // [示例] Sa-Token 集成 Solon、Reisson + ├── sa-token-demo-solon-redisson // [示例] Sa-Token 集成 Solon、Redisson ├── sa-token-demo-springboot // [示例] Sa-Token 整合 SpringBoot ├── sa-token-demo-springboot3-redis // [示例] Sa-Token 整合 SpringBoot3 整合 Redis ├── sa-token-demo-springboot-low-version // [示例] Sa-Token 整合 SpringBoot2 低版本