1
0
mirror of https://gitee.com/dromara/sa-token.git synced 2025-04-05 17:37:53 +08:00

feat: SaLoginParameter 支持配置 isShare

This commit is contained in:
click33 2025-03-02 01:25:14 +08:00
parent 16cf2db334
commit 3bc9e88645
5 changed files with 35 additions and 8 deletions
sa-token-core/src/main/java/cn/dev33/satoken/stp
sa-token-demo/sa-token-demo-test/src/main/java/com/pj/test
sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt

View File

@ -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

View File

@ -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();
}

View File

@ -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("登录成功");
}

View File

@ -265,7 +265,7 @@ public class StpLogicJwtForMixin extends StpLogic {
* @return /
*/
@Override
public boolean getConfigOfIsShare() {
public boolean isSupportShareToken() {
return false;
}

View File

@ -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;