diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginParameter.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginParameter.java index bf3d2589..7d546636 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginParameter.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginParameter.java @@ -81,6 +81,11 @@ public class SaLoginParameter { */ private Boolean isConcurrent; + /** + * 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token) + */ + private Boolean isShare = true; + /** * 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在) */ @@ -111,6 +116,7 @@ public class SaLoginParameter { this.device = SaTokenConsts.DEFAULT_LOGIN_DEVICE; this.timeout = config.getTimeout(); this.isConcurrent = config.getIsConcurrent(); + this.isShare = config.getIsShare(); this.isLastingCookie = config.getIsLastingCookie(); this.isWriteHeader = config.getIsWriteHeader(); return this; @@ -271,6 +277,22 @@ public class SaLoginParameter { return this; } + /** + * @return 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个token, 为 false 时每次登录新建一个 token) + */ + public Boolean getIsShare() { + return isShare; + } + + /** + * @param isShare 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个token, 为 false 时每次登录新建一个 token) + * @return 对象自身 + */ + public SaLoginParameter setIsShare(Boolean isShare) { + this.isShare = isShare; + return this; + } + /** * @return 扩展信息(只在jwt模式下生效) */ @@ -349,6 +371,8 @@ public class SaLoginParameter { + ", isLastingCookie=" + isLastingCookie + ", timeout=" + timeout + ", activeTimeout=" + activeTimeout + + ", isConcurrent=" + isConcurrent + + ", isShare=" + isShare + ", extraData=" + extraData + ", token=" + token + ", isWriteHeader=" + isWriteHeader diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java index 8600c28f..832c9cf1 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java @@ -528,8 +528,8 @@ public class StpLogic { // 3、只有在配置了 [ 允许一个账号多地同时登录 ] 时,才尝试复用旧 token,这样可以避免不必要地查询,节省开销 if(loginParameter.getIsConcurrent()) { - // 3.1、看看全局配置的 IsShare 参数,配置为 true 才是允许复用旧 token - if(getConfigOfIsShare()) { + // 3.1、如果配置了允许复用旧 token + if(isSupportShareToken() && loginParameter.getIsShare()) { // 根据 账号id + 设备类型,尝试获取旧的 token String tokenValue = getTokenValueByLoginId(id, loginParameter.getDevice()); @@ -2829,11 +2829,11 @@ public class StpLogic { } /** - * 返回全局配置对象的 isShare 属性 + * 返回当前 StpLogic 是否支持共享 token 策略 * - * @return / + * @return / */ - public boolean getConfigOfIsShare() { + public boolean isSupportShareToken() { return getConfigOrGlobal().getIsShare(); } diff --git a/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/test/TestController.java b/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/test/TestController.java index ded81788..3304565a 100644 --- a/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/test/TestController.java +++ b/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/test/TestController.java @@ -26,7 +26,10 @@ public class TestController { // 测试登录 ---- http://localhost:8081/test/login @RequestMapping("login") public SaResult login(@RequestParam(defaultValue = "10001") long id) { - StpUtil.login(id, new SaLoginParameter().setIsConcurrent(true)); + StpUtil.login(id, new SaLoginParameter() + .setIsConcurrent(true) + .setIsShare(false) + ); return SaResult.ok("登录成功"); } diff --git a/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForMixin.java b/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForMixin.java index 11713d46..e530d173 100644 --- a/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForMixin.java +++ b/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForMixin.java @@ -265,7 +265,7 @@ public class StpLogicJwtForMixin extends StpLogic { * @return / */ @Override - public boolean getConfigOfIsShare() { + public boolean isSupportShareToken() { return false; } diff --git a/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForSimple.java b/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForSimple.java index a384a38d..dfe8c7b2 100644 --- a/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForSimple.java +++ b/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForSimple.java @@ -83,7 +83,7 @@ public class StpLogicJwtForSimple extends StpLogic { @Override - public boolean getConfigOfIsShare() { + public boolean isSupportShareToken() { // 为确保 jwt-simple 模式的 token Extra 数据生成不受旧token影响,这里必须让 is-share 恒为 false // 即:在使用 jwt-simple 模式后,即使配置了 is-share=true 也不能复用旧 Token,必须每次创建新 Token return false;