refactor: SaLoginModel -> SaLoginParameter

This commit is contained in:
click33 2025-03-01 21:15:37 +08:00
parent ce74d5f41f
commit 0743b67cf8
19 changed files with 212 additions and 194 deletions

View File

@ -22,7 +22,7 @@ import cn.dev33.satoken.annotation.handler.SaAnnotationHandlerInterface;
import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.config.SaTokenConfig;
import cn.dev33.satoken.error.SaErrorCode; import cn.dev33.satoken.error.SaErrorCode;
import cn.dev33.satoken.exception.SaTokenException; import cn.dev33.satoken.exception.SaTokenException;
import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.SaLoginParameter;
import cn.dev33.satoken.stp.StpLogic; import cn.dev33.satoken.stp.StpLogic;
/** /**
@ -149,11 +149,11 @@ public class SaTokenEventCenter {
* @param loginType 账号类别 * @param loginType 账号类别
* @param loginId 账号id * @param loginId 账号id
* @param tokenValue 本次登录产生的 token * @param tokenValue 本次登录产生的 token
* @param loginModel 登录参数 * @param loginParameter 登录参数
*/ */
public static void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) { public static void doLogin(String loginType, Object loginId, String tokenValue, SaLoginParameter loginParameter) {
for (SaTokenListener listener : listenerList) { for (SaTokenListener listener : listenerList) {
listener.doLogin(loginType, loginId, tokenValue, loginModel); listener.doLogin(loginType, loginId, tokenValue, loginParameter);
} }
} }

View File

@ -17,7 +17,7 @@ package cn.dev33.satoken.listener;
import cn.dev33.satoken.annotation.handler.SaAnnotationHandlerInterface; import cn.dev33.satoken.annotation.handler.SaAnnotationHandlerInterface;
import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.config.SaTokenConfig;
import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.SaLoginParameter;
import cn.dev33.satoken.stp.StpLogic; import cn.dev33.satoken.stp.StpLogic;
/** /**
@ -35,9 +35,9 @@ public interface SaTokenListener {
* @param loginType 账号类别 * @param loginType 账号类别
* @param loginId 账号id * @param loginId 账号id
* @param tokenValue 本次登录产生的 token * @param tokenValue 本次登录产生的 token
* @param loginModel 登录参数 * @param loginParameter 登录参数
*/ */
void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel); void doLogin(String loginType, Object loginId, String tokenValue, SaLoginParameter loginParameter);
/** /**
* 每次注销时触发 * 每次注销时触发

View File

@ -17,7 +17,7 @@ package cn.dev33.satoken.listener;
import cn.dev33.satoken.annotation.handler.SaAnnotationHandlerInterface; import cn.dev33.satoken.annotation.handler.SaAnnotationHandlerInterface;
import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.config.SaTokenConfig;
import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.SaLoginParameter;
import cn.dev33.satoken.stp.StpLogic; import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.util.SaFoxUtil; import cn.dev33.satoken.util.SaFoxUtil;
@ -35,7 +35,7 @@ public class SaTokenListenerForLog implements SaTokenListener {
* 每次登录时触发 * 每次登录时触发
*/ */
@Override @Override
public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) { public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginParameter loginParameter) {
log.info("账号 {} 登录成功 (loginType={}), 会话凭证 token={}", loginId, loginType, tokenValue); log.info("账号 {} 登录成功 (loginType={}), 会话凭证 token={}", loginId, loginType, tokenValue);
} }

View File

@ -15,7 +15,7 @@
*/ */
package cn.dev33.satoken.listener; package cn.dev33.satoken.listener;
import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.SaLoginParameter;
/** /**
* Sa-Token 侦听器默认空实现 * Sa-Token 侦听器默认空实现
@ -28,7 +28,7 @@ import cn.dev33.satoken.stp.SaLoginModel;
public class SaTokenListenerForSimple implements SaTokenListener { public class SaTokenListenerForSimple implements SaTokenListener {
@Override @Override
public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) { public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginParameter loginParameter) {
} }

View File

@ -15,22 +15,27 @@
*/ */
package cn.dev33.satoken.stp; package cn.dev33.satoken.stp;
import cn.dev33.satoken.SaManager;
import java.util.Map; import java.util.Map;
/** /**
* 快速简洁的构建调用 `StpUtil.login()` 时的 [ 配置参数 SaLoginModel ] * <h2> 请更换为 new SaLoginParameter() </h2>
*
* 快速简洁的构建调用 `StpUtil.login()` 时的 [ 配置参数 SaLoginParameter ]
* *
* <pre> * <pre>
* // 例如在登录时指定 token 有效期为七天代码如下 * // 例如在登录时指定 token 有效期为七天代码如下
* StpUtil.login(10001, SaLoginConfig.setTimeout(60 * 60 * 24 * 7)); * StpUtil.login(10001, SaLoginConfig.setTimeout(60 * 60 * 24 * 7));
* *
* // 上面的代码与下面的代码等价 * // 上面的代码与下面的代码等价
* StpUtil.login(10001, new SaLoginModel().setTimeout(60 * 60 * 24 * 7)); * StpUtil.login(10001, new SaLoginParameter().setTimeout(60 * 60 * 24 * 7));
* </pre> * </pre>
* *
* @author click33 * @author click33
* @since 1.29.0 * @since 1.29.0
*/ */
@Deprecated
public class SaLoginConfig { public class SaLoginConfig {
private SaLoginConfig() { private SaLoginConfig() {
@ -40,7 +45,7 @@ public class SaLoginConfig {
* @param device 此次登录的客户端设备类型 * @param device 此次登录的客户端设备类型
* @return 登录参数 Model * @return 登录参数 Model
*/ */
public static SaLoginModel setDevice(String device) { public static SaLoginParameter setDevice(String device) {
return create().setDevice(device); return create().setDevice(device);
} }
@ -48,7 +53,7 @@ public class SaLoginConfig {
* @param isLastingCookie 是否为持久Cookie临时Cookie在浏览器关闭时会自动删除持久Cookie在重新打开后依然存在 * @param isLastingCookie 是否为持久Cookie临时Cookie在浏览器关闭时会自动删除持久Cookie在重新打开后依然存在
* @return 登录参数 Model * @return 登录参数 Model
*/ */
public static SaLoginModel setIsLastingCookie(Boolean isLastingCookie) { public static SaLoginParameter setIsLastingCookie(Boolean isLastingCookie) {
return create().setIsLastingCookie(isLastingCookie); return create().setIsLastingCookie(isLastingCookie);
} }
@ -56,7 +61,7 @@ public class SaLoginConfig {
* @param timeout 指定此次登录token的有效期, 单位: 如未指定自动取全局配置的timeout值 * @param timeout 指定此次登录token的有效期, 单位: 如未指定自动取全局配置的timeout值
* @return 登录参数 Model * @return 登录参数 Model
*/ */
public static SaLoginModel setTimeout(long timeout) { public static SaLoginParameter setTimeout(long timeout) {
return create().setTimeout(timeout); return create().setTimeout(timeout);
} }
@ -64,7 +69,7 @@ public class SaLoginConfig {
* @param activeTimeout 指定此次登录 token 最低活跃频率单位如未指定自动取全局配置的 activeTimeout * @param activeTimeout 指定此次登录 token 最低活跃频率单位如未指定自动取全局配置的 activeTimeout
* @return 对象自身 * @return 对象自身
*/ */
public static SaLoginModel setActiveTimeout(long activeTimeout) { public static SaLoginParameter setActiveTimeout(long activeTimeout) {
return create().setActiveTimeout(activeTimeout); return create().setActiveTimeout(activeTimeout);
} }
@ -72,7 +77,7 @@ public class SaLoginConfig {
* @param extraData 扩展信息只在jwt模式下生效 * @param extraData 扩展信息只在jwt模式下生效
* @return 登录参数 Model * @return 登录参数 Model
*/ */
public static SaLoginModel setExtraData(Map<String, Object> extraData) { public static SaLoginParameter setExtraData(Map<String, Object> extraData) {
return create().setExtraData(extraData); return create().setExtraData(extraData);
} }
@ -80,7 +85,7 @@ public class SaLoginConfig {
* @param token 预定Token预定本次登录生成的Token值 * @param token 预定Token预定本次登录生成的Token值
* @return 登录参数 Model * @return 登录参数 Model
*/ */
public static SaLoginModel setToken(String token) { public static SaLoginParameter setToken(String token) {
return create().setToken(token); return create().setToken(token);
} }
@ -90,7 +95,7 @@ public class SaLoginConfig {
* @param value * @param value
* @return 登录参数 Model * @return 登录参数 Model
*/ */
public static SaLoginModel setExtra(String key, Object value) { public static SaLoginParameter setExtra(String key, Object value) {
return create().setExtra(key, value); return create().setExtra(key, value);
} }
@ -98,7 +103,7 @@ public class SaLoginConfig {
* @param isWriteHeader 是否在登录后将 Token 写入到响应头 * @param isWriteHeader 是否在登录后将 Token 写入到响应头
* @return 登录参数 Model * @return 登录参数 Model
*/ */
public static SaLoginModel setIsWriteHeader(Boolean isWriteHeader) { public static SaLoginParameter setIsWriteHeader(Boolean isWriteHeader) {
return create().setIsWriteHeader(isWriteHeader); return create().setIsWriteHeader(isWriteHeader);
} }
@ -108,16 +113,16 @@ public class SaLoginConfig {
* @param tokenSignTag / * @param tokenSignTag /
* @return 登录参数 Model * @return 登录参数 Model
*/ */
public static SaLoginModel setTokenSignTag(Object tokenSignTag) { public static SaLoginParameter setTokenSignTag(Object tokenSignTag) {
return create().setTokenSignTag(tokenSignTag); return create().setTokenSignTag(tokenSignTag);
} }
/** /**
* 静态方法获取一个 SaLoginModel 对象 * 静态方法获取一个 SaLoginParameter 对象
* @return SaLoginModel 对象 * @return SaLoginParameter 对象
*/ */
public static SaLoginModel create() { public static SaLoginParameter create() {
return new SaLoginModel(); return new SaLoginParameter(SaManager.getConfig());
} }
} }

View File

@ -28,13 +28,18 @@ import java.util.Map;
* *
* <pre> * <pre>
* // 例如在登录时指定 token 有效期为七天代码如下 * // 例如在登录时指定 token 有效期为七天代码如下
* StpUtil.login(10001, new SaLoginModel().setTimeout(60 * 60 * 24 * 7)); * StpUtil.login(10001, new SaLoginParameter().setTimeout(60 * 60 * 24 * 7));
* </pre> * </pre>
* *
* @author click33 * @author click33
* @since 1.13.2 * @since 1.13.2
*/ */
public class SaLoginModel { public class SaLoginParameter {
// /**
// * 该对象是否已构造完毕
// */
// public boolean isBuild = false;
// --------- 单独参数 // --------- 单独参数
@ -82,7 +87,30 @@ public class SaLoginModel {
private Boolean isWriteHeader; private Boolean isWriteHeader;
// ------ 附加方法 // ------ 附加方法
public SaLoginParameter() {
this(SaManager.getConfig());
}
public SaLoginParameter(SaTokenConfig config) {
setDefaultValues(config);
}
/**
* 根据 SaTokenConfig 对象初始化默认值
*
* @param config 使用的配置对象
* @return 对象自身
*/
public SaLoginParameter setDefaultValues(SaTokenConfig config) {
this.device = SaTokenConsts.DEFAULT_LOGIN_DEVICE;
this.isLastingCookie = config.getIsLastingCookie();
this.timeout = config.getTimeout();
this.isWriteHeader = config.getIsWriteHeader();
return this;
}
/** /**
* 写入扩展数据只在jwt模式下生效 * 写入扩展数据只在jwt模式下生效
@ -90,7 +118,7 @@ public class SaLoginModel {
* @param value * @param value
* @return 对象自身 * @return 对象自身
*/ */
public SaLoginModel setExtra(String key, Object value) { public SaLoginParameter setExtra(String key, Object value) {
if(this.extraData == null) { if(this.extraData == null) {
this.extraData = new LinkedHashMap<>(); this.extraData = new LinkedHashMap<>();
} }
@ -119,7 +147,8 @@ public class SaLoginModel {
} }
/** /**
* @return Cookie时长 * 计算 Cookie 时长
* @return /
*/ */
public int getCookieTimeout() { public int getCookieTimeout() {
if( ! getIsLastingCookie()) { if( ! getIsLastingCookie()) {
@ -143,40 +172,11 @@ public class SaLoginModel {
} }
/** /**
* 构建对象初始化默认值 * 静态方法获取一个 SaLoginParameter 对象
* @return 对象自身 * @return SaLoginParameter 对象
*/ */
public SaLoginModel build() { public static SaLoginParameter create() {
return build(SaManager.getConfig()); return new SaLoginParameter(SaManager.getConfig());
}
/**
* 构建对象初始化默认值
* @param config 配置对象
* @return 对象自身
*/
public SaLoginModel build(SaTokenConfig config) {
// if(device == null) {
// device = SaTokenConsts.DEFAULT_LOGIN_DEVICE;
// }
if(isLastingCookie == null) {
isLastingCookie = config.getIsLastingCookie();
}
if(timeout == null) {
timeout = config.getTimeout();
}
if(isWriteHeader == null) {
isWriteHeader = config.getIsWriteHeader();
}
return this;
}
/**
* 静态方法获取一个 SaLoginModel 对象
* @return SaLoginModel 对象
*/
public static SaLoginModel create() {
return new SaLoginModel();
} }
@ -196,7 +196,7 @@ public class SaLoginModel {
* @param device 此次登录的客户端设备类型 * @param device 此次登录的客户端设备类型
* @return 对象自身 * @return 对象自身
*/ */
public SaLoginModel setDevice(String device) { public SaLoginParameter setDevice(String device) {
this.device = device; this.device = device;
return this; return this;
} }
@ -212,7 +212,7 @@ public class SaLoginModel {
* @param isLastingCookie 是否为持久Cookie临时Cookie在浏览器关闭时会自动删除持久Cookie在重新打开后依然存在 * @param isLastingCookie 是否为持久Cookie临时Cookie在浏览器关闭时会自动删除持久Cookie在重新打开后依然存在
* @return 对象自身 * @return 对象自身
*/ */
public SaLoginModel setIsLastingCookie(Boolean isLastingCookie) { public SaLoginParameter setIsLastingCookie(Boolean isLastingCookie) {
this.isLastingCookie = isLastingCookie; this.isLastingCookie = isLastingCookie;
return this; return this;
} }
@ -228,7 +228,7 @@ public class SaLoginModel {
* @param timeout 指定此次登录 token 有效期单位 如未指定自动取全局配置的 timeout * @param timeout 指定此次登录 token 有效期单位 如未指定自动取全局配置的 timeout
* @return 对象自身 * @return 对象自身
*/ */
public SaLoginModel setTimeout(long timeout) { public SaLoginParameter setTimeout(long timeout) {
this.timeout = timeout; this.timeout = timeout;
return this; return this;
} }
@ -245,7 +245,7 @@ public class SaLoginModel {
* @param activeTimeout 指定此次登录 token 最低活跃频率单位如未指定则使用全局配置的 activeTimeout * @param activeTimeout 指定此次登录 token 最低活跃频率单位如未指定则使用全局配置的 activeTimeout
* @return 对象自身 * @return 对象自身
*/ */
public SaLoginModel setActiveTimeout(long activeTimeout) { public SaLoginParameter setActiveTimeout(long activeTimeout) {
this.activeTimeout = activeTimeout; this.activeTimeout = activeTimeout;
return this; return this;
} }
@ -261,7 +261,7 @@ public class SaLoginModel {
* @param extraData 扩展信息只在jwt模式下生效 * @param extraData 扩展信息只在jwt模式下生效
* @return 对象自身 * @return 对象自身
*/ */
public SaLoginModel setExtraData(Map<String, Object> extraData) { public SaLoginParameter setExtraData(Map<String, Object> extraData) {
this.extraData = extraData; this.extraData = extraData;
return this; return this;
} }
@ -277,7 +277,7 @@ public class SaLoginModel {
* @param token 预定Token预定本次登录生成的Token值 * @param token 预定Token预定本次登录生成的Token值
* @return 对象自身 * @return 对象自身
*/ */
public SaLoginModel setToken(String token) { public SaLoginParameter setToken(String token) {
this.token = token; this.token = token;
return this; return this;
} }
@ -293,7 +293,7 @@ public class SaLoginModel {
* @param isWriteHeader 是否在登录后将 Token 写入到响应头 * @param isWriteHeader 是否在登录后将 Token 写入到响应头
* @return 对象自身 * @return 对象自身
*/ */
public SaLoginModel setIsWriteHeader(Boolean isWriteHeader) { public SaLoginParameter setIsWriteHeader(Boolean isWriteHeader) {
this.isWriteHeader = isWriteHeader; this.isWriteHeader = isWriteHeader;
return this; return this;
} }
@ -313,7 +313,7 @@ public class SaLoginModel {
* @param tokenSignTag 本次登录挂载到 TokenSign 的数据 * @param tokenSignTag 本次登录挂载到 TokenSign 的数据
* @return 对象自身 * @return 对象自身
*/ */
public SaLoginModel setTokenSignTag(Object tokenSignTag) { public SaLoginParameter setTokenSignTag(Object tokenSignTag) {
this.tokenSignTag = tokenSignTag; this.tokenSignTag = tokenSignTag;
return this; return this;
} }
@ -323,7 +323,7 @@ public class SaLoginModel {
*/ */
@Override @Override
public String toString() { public String toString() {
return "SaLoginModel [" return "SaLoginParameter ["
+ "device=" + device + "device=" + device
+ ", isLastingCookie=" + isLastingCookie + ", isLastingCookie=" + isLastingCookie
+ ", timeout=" + timeout + ", timeout=" + timeout

View File

@ -169,7 +169,7 @@ public class StpLogic {
* @param tokenValue token * @param tokenValue token
*/ */
public void setTokenValue(String tokenValue){ public void setTokenValue(String tokenValue){
setTokenValue(tokenValue, new SaLoginModel().setTimeout(getConfigOrGlobal().getTimeout())); setTokenValue(tokenValue, createSaLoginParameter().setTimeout(getConfigOrGlobal().getTimeout()));
} }
/** /**
@ -179,35 +179,32 @@ public class StpLogic {
* @param cookieTimeout Cookie存活时间() * @param cookieTimeout Cookie存活时间()
*/ */
public void setTokenValue(String tokenValue, int cookieTimeout){ public void setTokenValue(String tokenValue, int cookieTimeout){
setTokenValue(tokenValue, new SaLoginModel().setTimeout(cookieTimeout)); setTokenValue(tokenValue, createSaLoginParameter().setTimeout(cookieTimeout));
} }
/** /**
* 在当前会话写入指定 token * 在当前会话写入指定 token
* *
* @param tokenValue token * @param tokenValue token
* @param loginModel 登录参数 * @param loginParameter 登录参数
*/ */
public void setTokenValue(String tokenValue, SaLoginModel loginModel){ public void setTokenValue(String tokenValue, SaLoginParameter loginParameter){
// 先判断一下如果提供 token 为空则不执行任何动作 // 先判断一下如果提供 token 为空则不执行任何动作
if(SaFoxUtil.isEmpty(tokenValue)) { if(SaFoxUtil.isEmpty(tokenValue)) {
return; return;
} }
// 构建一下
loginModel.build(getConfigOrGlobal());
// 1 token 写入到当前请求的 Storage 存储器里 // 1 token 写入到当前请求的 Storage 存储器里
setTokenValueToStorage(tokenValue); setTokenValueToStorage(tokenValue);
// 2. token 写入到当前会话的 Cookie // 2. token 写入到当前会话的 Cookie
if (getConfigOrGlobal().getIsReadCookie()) { if (getConfigOrGlobal().getIsReadCookie()) {
setTokenValueToCookie(tokenValue, loginModel.getCookieTimeout()); setTokenValueToCookie(tokenValue, loginParameter.getCookieTimeout());
} }
// 3. token 写入到当前请求的响应头中 // 3. token 写入到当前请求的响应头中
if(loginModel.getIsWriteHeader()) { if(loginParameter.getIsWriteHeader()) {
setTokenValueToResponseHeader(tokenValue); setTokenValueToResponseHeader(tokenValue);
} }
} }
@ -399,7 +396,7 @@ public class StpLogic {
* @param id 账号id建议的类型long | int | String * @param id 账号id建议的类型long | int | String
*/ */
public void login(Object id) { public void login(Object id) {
login(id, new SaLoginModel()); login(id, createSaLoginParameter());
} }
/** /**
@ -409,7 +406,7 @@ public class StpLogic {
* @param device 设备类型 * @param device 设备类型
*/ */
public void login(Object id, String device) { public void login(Object id, String device) {
login(id, new SaLoginModel().setDevice(device)); login(id, createSaLoginParameter().setDevice(device));
} }
/** /**
@ -419,7 +416,7 @@ public class StpLogic {
* @param isLastingCookie 是否为持久Cookie值为 true 时记住我值为 false 时关闭浏览器需要重新登录 * @param isLastingCookie 是否为持久Cookie值为 true 时记住我值为 false 时关闭浏览器需要重新登录
*/ */
public void login(Object id, boolean isLastingCookie) { public void login(Object id, boolean isLastingCookie) {
login(id, new SaLoginModel().setIsLastingCookie(isLastingCookie)); login(id, createSaLoginParameter().setIsLastingCookie(isLastingCookie));
} }
/** /**
@ -429,21 +426,21 @@ public class StpLogic {
* @param timeout 此次登录 token 的有效期, 单位: * @param timeout 此次登录 token 的有效期, 单位:
*/ */
public void login(Object id, long timeout) { public void login(Object id, long timeout) {
login(id, new SaLoginModel().setTimeout(timeout)); login(id, createSaLoginParameter().setTimeout(timeout));
} }
/** /**
* 会话登录并指定所有登录参数 Model * 会话登录并指定所有登录参数 Model
* *
* @param id 账号id建议的类型long | int | String * @param id 账号id建议的类型long | int | String
* @param loginModel 此次登录的参数Model * @param loginParameter 此次登录的参数Model
*/ */
public void login(Object id, SaLoginModel loginModel) { public void login(Object id, SaLoginParameter loginParameter) {
// 1创建会话 // 1创建会话
String token = createLoginSession(id, loginModel); String token = createLoginSession(id, loginParameter);
// 2在当前客户端注入 token // 2在当前客户端注入 token
setTokenValue(token, loginModel); setTokenValue(token, loginParameter);
} }
/** /**
@ -453,59 +450,57 @@ public class StpLogic {
* @return 返回会话令牌 * @return 返回会话令牌
*/ */
public String createLoginSession(Object id) { public String createLoginSession(Object id) {
return createLoginSession(id, new SaLoginModel()); return createLoginSession(id, createSaLoginParameter());
} }
/** /**
* 创建指定账号 id 的登录会话数据 * 创建指定账号 id 的登录会话数据
* *
* @param id 账号id建议的类型long | int | String * @param id 账号id建议的类型long | int | String
* @param loginModel 此次登录的参数Model * @param loginParameter 此次登录的参数Model
* @return 返回会话令牌 * @return 返回会话令牌
*/ */
public String createLoginSession(Object id, SaLoginModel loginModel) { public String createLoginSession(Object id, SaLoginParameter loginParameter) {
SaTokenConfig config = getConfigOrGlobal();
// 1先检查一下传入的参数是否有效 // 1先检查一下传入的参数是否有效
checkLoginArgs(id, loginModel); checkLoginArgs(id, loginParameter);
// 2初始化 loginModel 给一些参数补上默认值
SaTokenConfig config = getConfigOrGlobal();
loginModel.build(config);
// 3给这个账号分配一个可用的 token // 2给这个账号分配一个可用的 token
String tokenValue = distUsableToken(id, loginModel); String tokenValue = distUsableToken(id, loginParameter);
// 4获取此账号的 Account-Session , 续期 // 3获取此账号的 Account-Session , 续期
SaSession session = getSessionByLoginId(id, true, loginModel.getTimeout()); SaSession session = getSessionByLoginId(id, true, loginParameter.getTimeout());
session.updateMinTimeout(loginModel.getTimeout()); session.updateMinTimeout(loginParameter.getTimeout());
// 5 Account-Session 上记录本次登录的 token 签名 // 4 Account-Session 上记录本次登录的 token 签名
TokenSign tokenSign = new TokenSign(tokenValue, loginModel.getDeviceOrDefault(), loginModel.getTokenSignTag()); TokenSign tokenSign = new TokenSign(tokenValue, loginParameter.getDevice(), loginParameter.getTokenSignTag());
session.addTokenSign(tokenSign); session.addTokenSign(tokenSign);
// 6保存 token -> id 的映射关系方便日后根据 token 找账号 id // 5保存 token -> id 的映射关系方便日后根据 token 找账号 id
saveTokenToIdMapping(tokenValue, id, loginModel.getTimeout()); saveTokenToIdMapping(tokenValue, id, loginParameter.getTimeout());
// 7写入这个 token 的最后活跃时间 token-last-active // 6写入这个 token 的最后活跃时间 token-last-active
if(isOpenCheckActiveTimeout()) { if(isOpenCheckActiveTimeout()) {
setLastActiveToNow(tokenValue, loginModel.getActiveTimeout(), loginModel.getTimeout()); setLastActiveToNow(tokenValue, loginParameter.getActiveTimeout(), loginParameter.getTimeout());
} }
// 8如果该 token 对应的 Token-Session 已经存在则需要给其续期 // 7如果该 token 对应的 Token-Session 已经存在则需要给其续期
SaSession tokenSession = getTokenSessionByToken(tokenValue, false); SaSession tokenSession = getTokenSessionByToken(tokenValue, false);
if(tokenSession != null) { if(tokenSession != null) {
tokenSession.updateMinTimeout(loginModel.getTimeout()); tokenSession.updateMinTimeout(loginParameter.getTimeout());
} }
// 9$$ 发布全局事件账号 xxx 登录成功 // 8$$ 发布全局事件账号 xxx 登录成功
SaTokenEventCenter.doLogin(loginType, id, tokenValue, loginModel); SaTokenEventCenter.doLogin(loginType, id, tokenValue, loginParameter);
// 10检查此账号会话数量是否超出最大值如果超过则按照登录时间顺序把最开始登录的给注销掉 // 9检查此账号会话数量是否超出最大值如果超过则按照登录时间顺序把最开始登录的给注销掉
if(config.getMaxLoginCount() != -1) { if(config.getMaxLoginCount() != -1) {
logoutByMaxLoginCount(id, session, null, config.getMaxLoginCount()); logoutByMaxLoginCount(id, session, null, config.getMaxLoginCount());
} }
// 11一切处理完毕返回会话凭证 token // 10一切处理完毕返回会话凭证 token
return tokenValue; return tokenValue;
} }
@ -513,21 +508,22 @@ public class StpLogic {
* 为指定账号 id 的登录操作分配一个可用的 token * 为指定账号 id 的登录操作分配一个可用的 token
* *
* @param id 账号id * @param id 账号id
* @param loginModel 此次登录的参数Model * @param loginParameter 此次登录的参数Model
* @return 返回 token * @return 返回 token
*/ */
protected String distUsableToken(Object id, SaLoginModel loginModel) { protected String distUsableToken(Object id, SaLoginParameter loginParameter) {
// 1获取全局配置的 isConcurrent 参数 // 1获取全局配置的 isConcurrent 参数
// 如果配置为不允许一个账号多地同时登录则需要先将这个账号的历史登录会话标记为被顶下线 // 如果配置为不允许一个账号多地同时登录则需要先将这个账号的历史登录会话标记为被顶下线
Boolean isConcurrent = getConfigOrGlobal().getIsConcurrent(); Boolean isConcurrent = getConfigOrGlobal().getIsConcurrent();
if( ! isConcurrent) { if( ! isConcurrent) {
replaced(id, loginModel.getDevice()); // TODO 此处应该加一个配置决定是只顶掉当前设备类型还是所有类型
replaced(id, loginParameter.getDevice());
} }
// 2如果调用者预定了要生成的 token则直接返回这个预定的值框架无需再操心了 // 2如果调用者预定了要生成的 token则直接返回这个预定的值框架无需再操心了
if(SaFoxUtil.isNotEmpty(loginModel.getToken())) { if(SaFoxUtil.isNotEmpty(loginParameter.getToken())) {
return loginModel.getToken(); return loginParameter.getToken();
} }
// 3只有在配置了 [ 允许一个账号多地同时登录 ] 才尝试复用旧 token这样可以避免不必要地查询节省开销 // 3只有在配置了 [ 允许一个账号多地同时登录 ] 才尝试复用旧 token这样可以避免不必要地查询节省开销
@ -537,7 +533,7 @@ public class StpLogic {
if(getConfigOfIsShare()) { if(getConfigOfIsShare()) {
// 根据 账号id + 设备类型尝试获取旧的 token // 根据 账号id + 设备类型尝试获取旧的 token
String tokenValue = getTokenValueByLoginId(id, loginModel.getDeviceOrDefault()); String tokenValue = getTokenValueByLoginId(id, loginParameter.getDevice());
// 如果有值那就直接复用 // 如果有值那就直接复用
if(SaFoxUtil.isNotEmpty(tokenValue)) { if(SaFoxUtil.isNotEmpty(tokenValue)) {
@ -554,7 +550,7 @@ public class StpLogic {
"token", "token",
getConfigOfMaxTryTimes(), getConfigOfMaxTryTimes(),
() -> { () -> {
return createTokenValue(id, loginModel.getDeviceOrDefault(), loginModel.getTimeout(), loginModel.getExtraData()); return createTokenValue(id, loginParameter.getDevice(), loginParameter.getTimeout(), loginParameter.getExtraData());
}, },
tokenValue -> { tokenValue -> {
return getLoginIdNotHandle(tokenValue) == null; return getLoginIdNotHandle(tokenValue) == null;
@ -566,9 +562,9 @@ public class StpLogic {
* 校验登录时的参数有效性如果有问题会打印警告或抛出异常 * 校验登录时的参数有效性如果有问题会打印警告或抛出异常
* *
* @param id 账号id * @param id 账号id
* @param loginModel 此次登录的参数Model * @param loginParameter 此次登录的参数Model
*/ */
protected void checkLoginArgs(Object id, SaLoginModel loginModel) { protected void checkLoginArgs(Object id, SaLoginParameter loginParameter) {
// 1账号 id 不能为空 // 1账号 id 不能为空
if(SaFoxUtil.isEmpty(id)) { if(SaFoxUtil.isEmpty(id)) {
@ -588,14 +584,13 @@ public class StpLogic {
// 4判断当前 StpLogic 是否支持 extra 扩展参数 // 4判断当前 StpLogic 是否支持 extra 扩展参数
if( ! isSupportExtra()) { if( ! isSupportExtra()) {
// 如果不支持开发者却传入了 extra 扩展参数那么就打印警告信息 // 如果不支持开发者却传入了 extra 扩展参数那么就打印警告信息
Map<String, Object> extraData = loginModel.getExtraData(); if(loginParameter.isSetExtraData()) {
if(extraData != null && extraData.size() > 0) {
SaManager.log.warn("当前 StpLogic 不支持 extra 扩展参数模式,传入的 extra 参数将被忽略"); SaManager.log.warn("当前 StpLogic 不支持 extra 扩展参数模式,传入的 extra 参数将被忽略");
} }
} }
// 5如果全局配置未启动动态 activeTimeout 功能但是此次登录却传入了 activeTimeout 参数那么就打印警告信息 // 5如果全局配置未启动动态 activeTimeout 功能但是此次登录却传入了 activeTimeout 参数那么就打印警告信息
if( ! getConfigOrGlobal().getDynamicActiveTimeout() && loginModel.getActiveTimeout() != null) { if( ! getConfigOrGlobal().getDynamicActiveTimeout() && loginParameter.getActiveTimeout() != null) {
SaManager.log.warn("当前全局配置未开启动态 activeTimeout 功能,传入的 activeTimeout 参数将被忽略"); SaManager.log.warn("当前全局配置未开启动态 activeTimeout 功能,传入的 activeTimeout 参数将被忽略");
} }
@ -610,7 +605,7 @@ public class StpLogic {
public String getOrCreateLoginSession(Object id) { public String getOrCreateLoginSession(Object id) {
String tokenValue = getTokenValueByLoginId(id); String tokenValue = getTokenValueByLoginId(id);
if(tokenValue == null) { if(tokenValue == null) {
tokenValue = createLoginSession(id, new SaLoginModel()); tokenValue = createLoginSession(id, createSaLoginParameter());
} }
return tokenValue; return tokenValue;
} }
@ -2114,7 +2109,7 @@ public class StpLogic {
*/ */
public String getTokenValueByLoginId(Object loginId, String device) { public String getTokenValueByLoginId(Object loginId, String device) {
List<String> tokenValueList = getTokenValueListByLoginId(loginId, device); List<String> tokenValueList = getTokenValueListByLoginId(loginId, device);
return tokenValueList.size() == 0 ? null : tokenValueList.get(tokenValueList.size() - 1); return tokenValueList.isEmpty() ? null : tokenValueList.get(tokenValueList.size() - 1);
} }
/** /**
@ -2895,6 +2890,15 @@ public class StpLogic {
return false; return false;
} }
/**
* 根据当前配置对象创建一个 SaLoginParameter 对象
*
* @return /
*/
public SaLoginParameter createSaLoginParameter() {
return new SaLoginParameter(getConfigOrGlobal());
}
// ------------------- 过期方法 ------------------- // ------------------- 过期方法 -------------------

View File

@ -117,10 +117,10 @@ public class StpUtil {
* 在当前会话写入指定 token * 在当前会话写入指定 token
* *
* @param tokenValue token * @param tokenValue token
* @param loginModel 登录参数 * @param loginParameter 登录参数
*/ */
public static void setTokenValue(String tokenValue, SaLoginModel loginModel){ public static void setTokenValue(String tokenValue, SaLoginParameter loginParameter){
stpLogic.setTokenValue(tokenValue, loginModel); stpLogic.setTokenValue(tokenValue, loginParameter);
} }
/** /**
@ -198,10 +198,10 @@ public class StpUtil {
* 会话登录并指定所有登录参数 Model * 会话登录并指定所有登录参数 Model
* *
* @param id 账号id建议的类型long | int | String * @param id 账号id建议的类型long | int | String
* @param loginModel 此次登录的参数Model * @param loginParameter 此次登录的参数Model
*/ */
public static void login(Object id, SaLoginModel loginModel) { public static void login(Object id, SaLoginParameter loginParameter) {
stpLogic.login(id, loginModel); stpLogic.login(id, loginParameter);
} }
/** /**
@ -218,11 +218,11 @@ public class StpUtil {
* 创建指定账号 id 的登录会话数据 * 创建指定账号 id 的登录会话数据
* *
* @param id 账号id建议的类型long | int | String * @param id 账号id建议的类型long | int | String
* @param loginModel 此次登录的参数Model * @param loginParameter 此次登录的参数Model
* @return 返回会话令牌 * @return 返回会话令牌
*/ */
public static String createLoginSession(Object id, SaLoginModel loginModel) { public static String createLoginSession(Object id, SaLoginParameter loginParameter) {
return stpLogic.createLoginSession(id, loginModel); return stpLogic.createLoginSession(id, loginParameter);
} }
/** /**
@ -1260,4 +1260,16 @@ public class StpUtil {
stpLogic.closeSafe(service); stpLogic.closeSafe(service);
} }
// ------------------- Bean 对象字段代理 -------------------
/**
* 根据当前配置对象创建一个 SaLoginParameter 对象
*
* @return /
*/
public static SaLoginParameter createSaLoginParameter() {
return stpLogic.createSaLoginParameter();
}
} }

View File

@ -1,7 +1,7 @@
package com.pj.satoken; package com.pj.satoken;
import cn.dev33.satoken.listener.SaTokenListener; import cn.dev33.satoken.listener.SaTokenListener;
import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.SaLoginParameter;
/** /**
* Sa-Token 自定义侦听器的实现 * Sa-Token 自定义侦听器的实现
@ -14,7 +14,7 @@ public class MySaTokenListener implements SaTokenListener {
/** 每次登录时触发 */ /** 每次登录时触发 */
@Override @Override
public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) { public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginParameter loginParameter) {
System.out.println("---------- 自定义侦听器实现 doLogin"); System.out.println("---------- 自定义侦听器实现 doLogin");
} }

View File

@ -5,7 +5,7 @@ import cn.dev33.satoken.fun.SaFunction;
import cn.dev33.satoken.listener.SaTokenEventCenter; import cn.dev33.satoken.listener.SaTokenEventCenter;
import cn.dev33.satoken.session.SaSession; import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.session.TokenSign; import cn.dev33.satoken.session.TokenSign;
import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.SaLoginParameter;
import cn.dev33.satoken.stp.SaTokenInfo; import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpLogic; import cn.dev33.satoken.stp.StpLogic;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -107,10 +107,10 @@ public class StpUserUtil {
* 在当前会话写入指定 token * 在当前会话写入指定 token
* *
* @param tokenValue token * @param tokenValue token
* @param loginModel 登录参数 * @param loginParameter 登录参数
*/ */
public static void setTokenValue(String tokenValue, SaLoginModel loginModel){ public static void setTokenValue(String tokenValue, SaLoginParameter loginParameter){
stpLogic.setTokenValue(tokenValue, loginModel); stpLogic.setTokenValue(tokenValue, loginParameter);
} }
/** /**
@ -188,10 +188,10 @@ public class StpUserUtil {
* 会话登录并指定所有登录参数 Model * 会话登录并指定所有登录参数 Model
* *
* @param id 账号id建议的类型long | int | String * @param id 账号id建议的类型long | int | String
* @param loginModel 此次登录的参数Model * @param loginParameter 此次登录的参数Model
*/ */
public static void login(Object id, SaLoginModel loginModel) { public static void login(Object id, SaLoginParameter loginParameter) {
stpLogic.login(id, loginModel); stpLogic.login(id, loginParameter);
} }
/** /**
@ -208,11 +208,11 @@ public class StpUserUtil {
* 创建指定账号 id 的登录会话数据 * 创建指定账号 id 的登录会话数据
* *
* @param id 账号id建议的类型long | int | String * @param id 账号id建议的类型long | int | String
* @param loginModel 此次登录的参数Model * @param loginParameter 此次登录的参数Model
* @return 返回会话令牌 * @return 返回会话令牌
*/ */
public static String createLoginSession(Object id, SaLoginModel loginModel) { public static String createLoginSession(Object id, SaLoginParameter loginParameter) {
return stpLogic.createLoginSession(id, loginModel); return stpLogic.createLoginSession(id, loginParameter);
} }
/** /**

View File

@ -4,7 +4,7 @@ import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.fun.SaFunction; import cn.dev33.satoken.fun.SaFunction;
import cn.dev33.satoken.listener.SaTokenEventCenter; import cn.dev33.satoken.listener.SaTokenEventCenter;
import cn.dev33.satoken.session.SaSession; import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.SaLoginParameter;
import cn.dev33.satoken.stp.SaTokenInfo; import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpLogic; import cn.dev33.satoken.stp.StpLogic;
@ -104,10 +104,10 @@ public class StpUserUtil {
* 在当前会话写入指定 token * 在当前会话写入指定 token
* *
* @param tokenValue token * @param tokenValue token
* @param loginModel 登录参数 * @param loginParameter 登录参数
*/ */
public static void setTokenValue(String tokenValue, SaLoginModel loginModel){ public static void setTokenValue(String tokenValue, SaLoginParameter loginParameter){
stpLogic.setTokenValue(tokenValue, loginModel); stpLogic.setTokenValue(tokenValue, loginParameter);
} }
/** /**
@ -185,10 +185,10 @@ public class StpUserUtil {
* 会话登录并指定所有登录参数 Model * 会话登录并指定所有登录参数 Model
* *
* @param id 账号id建议的类型long | int | String * @param id 账号id建议的类型long | int | String
* @param loginModel 此次登录的参数Model * @param loginParameter 此次登录的参数Model
*/ */
public static void login(Object id, SaLoginModel loginModel) { public static void login(Object id, SaLoginParameter loginParameter) {
stpLogic.login(id, loginModel); stpLogic.login(id, loginParameter);
} }
/** /**
@ -205,11 +205,11 @@ public class StpUserUtil {
* 创建指定账号 id 的登录会话数据 * 创建指定账号 id 的登录会话数据
* *
* @param id 账号id建议的类型long | int | String * @param id 账号id建议的类型long | int | String
* @param loginModel 此次登录的参数Model * @param loginParameter 此次登录的参数Model
* @return 返回会话令牌 * @return 返回会话令牌
*/ */
public static String createLoginSession(Object id, SaLoginModel loginModel) { public static String createLoginSession(Object id, SaLoginParameter loginParameter) {
return stpLogic.createLoginSession(id, loginModel); return stpLogic.createLoginSession(id, loginParameter);
} }
/** /**

View File

@ -3,7 +3,7 @@ package com.pj.test;
import cn.dev33.satoken.annotation.SaCheckHttpDigest; import cn.dev33.satoken.annotation.SaCheckHttpDigest;
import cn.dev33.satoken.context.SaHolder; import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.spring.SpringMVCUtil; import cn.dev33.satoken.spring.SpringMVCUtil;
import cn.dev33.satoken.stp.SaLoginConfig; import cn.dev33.satoken.stp.SaLoginParameter;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaFoxUtil; import cn.dev33.satoken.util.SaFoxUtil;
import cn.dev33.satoken.util.SaResult; import cn.dev33.satoken.util.SaResult;
@ -26,7 +26,7 @@ public class TestController {
// 测试登录 ---- http://localhost:8081/test/login // 测试登录 ---- http://localhost:8081/test/login
@RequestMapping("login") @RequestMapping("login")
public SaResult login(@RequestParam(defaultValue = "10001") long id) { public SaResult login(@RequestParam(defaultValue = "10001") long id) {
StpUtil.login(id, SaLoginConfig.setActiveTimeout(-1)); StpUtil.login(id, new SaLoginParameter().setActiveTimeout(-1));
return SaResult.ok("登录成功"); return SaResult.ok("登录成功");
} }

View File

@ -23,15 +23,15 @@ StpUtil.getTokenInfo(); // 获取当前 Token 的详细参数。
StpUtil.login(10001); // 会话登录 StpUtil.login(10001); // 会话登录
StpUtil.login(10001, "APP"); // 会话登录,并指定设备类型 StpUtil.login(10001, "APP"); // 会话登录,并指定设备类型
StpUtil.login(10001, true); // 会话登录,并指定是否 [记住我] StpUtil.login(10001, true); // 会话登录,并指定是否 [记住我]
StpUtil.login(10001, loginModel); // 会话登录并指定所有登录参数Model StpUtil.login(10001, loginParameter); // 会话登录并指定所有登录参数Model
StpUtil.createLoginSession(10001); // 创建指定账号id的登录会话此方法不会将 Token 注入到上下文 StpUtil.createLoginSession(10001); // 创建指定账号id的登录会话此方法不会将 Token 注入到上下文
StpUtil.createLoginSession(10001, loginModel); // 创建指定账号id的登录会话此方法不会将 Token 注入到上下文 StpUtil.createLoginSession(10001, loginParameter); // 创建指定账号id的登录会话此方法不会将 Token 注入到上下文
``` ```
SaLoginModel 配置示例: SaLoginParameter 配置示例:
``` java ``` java
// SaLoginModel 配置登录相关参数 // SaLoginParameter 配置登录相关参数
StpUtil.login(10001, new SaLoginModel() StpUtil.login(10001, new SaLoginParameter()
.setDevice("PC") // 此次登录的客户端设备类型, 用于[同端互斥登录]时指定此次登录的设备类型 .setDevice("PC") // 此次登录的客户端设备类型, 用于[同端互斥登录]时指定此次登录的设备类型
.setIsLastingCookie(true) // 是否为持久Cookie临时Cookie在浏览器关闭时会自动删除持久Cookie在重新打开后依然存在 .setIsLastingCookie(true) // 是否为持久Cookie临时Cookie在浏览器关闭时会自动删除持久Cookie在重新打开后依然存在
.setTimeout(60 * 60 * 24 * 7) // 指定此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的 timeout 值) .setTimeout(60 * 60 * 24 * 7) // 指定此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的 timeout 值)

View File

@ -44,7 +44,7 @@ public void configOAuth2Server(SaOAuth2ServerConfig oauth2Server) {
### OAuth2-Client 数据互通 ### OAuth2-Client 数据互通
除了Server端Client端也可以打通 `access_token``satoken` 会话。做法是在 Client 端拿到 `access_token` 后进行登录时,使用 `SaLoginModel` 预定登录生成的 Token 值 除了Server端Client端也可以打通 `access_token``satoken` 会话。做法是在 Client 端拿到 `access_token` 后进行登录时,使用 `SaLoginParameter` 预定登录生成的 Token 值
``` java ``` java
// 1. 获取到access_token // 1. 获取到access_token

View File

@ -33,7 +33,7 @@ public class MySaTokenListener implements SaTokenListener {
/** 每次登录时触发 */ /** 每次登录时触发 */
@Override @Override
public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) { public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginParameter loginParameter) {
System.out.println("---------- 自定义侦听器实现 doLogin"); System.out.println("---------- 自定义侦听器实现 doLogin");
} }
@ -171,7 +171,7 @@ public class MySaTokenListener extends SaTokenListenerForSimple {
*/ */
/** 每次登录时触发 */ /** 每次登录时触发 */
@Override @Override
public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) { public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginParameter loginParameter) {
System.out.println("---------- 自定义侦听器实现 doLogin"); System.out.println("---------- 自定义侦听器实现 doLogin");
} }
} }
@ -182,7 +182,7 @@ public class MySaTokenListener extends SaTokenListenerForSimple {
// 登录时触发 // 登录时触发
SaTokenEventCenter.registerListener(new SaTokenListenerForSimple() { SaTokenEventCenter.registerListener(new SaTokenListenerForSimple() {
@Override @Override
public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) { public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginParameter loginParameter) {
System.out.println("---------------- doLogin"); System.out.println("---------------- doLogin");
} }
}); });
@ -195,7 +195,7 @@ SaTokenEventCenter.registerListener(new SaTokenListenerForSimple() {
// 登录时触发 // 登录时触发
SaTokenEventCenter.registerListener(new SaTokenListenerForSimple() { SaTokenEventCenter.registerListener(new SaTokenListenerForSimple() {
@Override @Override
public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) { public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginParameter loginParameter) {
try { try {
// 不安全代码需要写在 try-catch 里 // 不安全代码需要写在 try-catch 里
// ...... // ......

View File

@ -67,11 +67,11 @@ Remember me, it's too easy!
``` java ``` java
// 示例1 // 示例1
// 指定token有效期(单位: 秒)如下所示token七天有效 // 指定token有效期(单位: 秒)如下所示token七天有效
StpUtil.login(10001, new SaLoginModel().setTimeout(60 * 60 * 24 * 7)); StpUtil.login(10001, new SaLoginParameter().setTimeout(60 * 60 * 24 * 7));
// ----------------------- 示例2所有参数 // ----------------------- 示例2所有参数
// `SaLoginModel`为登录参数Model其有诸多参数决定登录时的各种逻辑例如 // `SaLoginParameter`为登录参数Model其有诸多参数决定登录时的各种逻辑例如
StpUtil.login(10001, new SaLoginModel() StpUtil.login(10001, new SaLoginParameter()
.setDevice("PC") // 此次登录的客户端设备类型, 用于[同端互斥登录]时指定此次登录的设备类型 .setDevice("PC") // 此次登录的客户端设备类型, 用于[同端互斥登录]时指定此次登录的设备类型
.setIsLastingCookie(true) // 是否为持久Cookie临时Cookie在浏览器关闭时会自动删除持久Cookie在重新打开后依然存在 .setIsLastingCookie(true) // 是否为持久Cookie临时Cookie在浏览器关闭时会自动删除持久Cookie在重新打开后依然存在
.setTimeout(60 * 60 * 24 * 7) // 指定此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的 timeout 值) .setTimeout(60 * 60 * 24 * 7) // 指定此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的 timeout 值)

View File

@ -22,7 +22,7 @@ import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.jwt.error.SaJwtErrorCode; import cn.dev33.satoken.jwt.error.SaJwtErrorCode;
import cn.dev33.satoken.jwt.exception.SaJwtException; import cn.dev33.satoken.jwt.exception.SaJwtException;
import cn.dev33.satoken.listener.SaTokenEventCenter; import cn.dev33.satoken.listener.SaTokenEventCenter;
import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.SaLoginParameter;
import cn.dev33.satoken.stp.SaTokenInfo; import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpLogic; import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
@ -102,23 +102,20 @@ public class StpLogicJwtForStateless extends StpLogic {
/** /**
* 创建指定账号id的登录会话 * 创建指定账号id的登录会话
* @param id 登录id建议的类型long | int | String * @param id 登录id建议的类型long | int | String
* @param loginModel 此次登录的参数Model * @param loginParameter 此次登录的参数Model
* @return 返回会话令牌 * @return 返回会话令牌
*/ */
@Override @Override
public String createLoginSession(Object id, SaLoginModel loginModel) { public String createLoginSession(Object id, SaLoginParameter loginParameter) {
// 1先检查一下传入的参数是否有效 // 1先检查一下传入的参数是否有效
checkLoginArgs(id, loginModel); checkLoginArgs(id, loginParameter);
// 2初始化 loginModel 给一些参数补上默认值
loginModel.build(getConfigOrGlobal());
// 3生成一个token // 3生成一个token
String tokenValue = createTokenValue(id, loginModel.getDeviceOrDefault(), loginModel.getTimeout(), loginModel.getExtraData()); String tokenValue = createTokenValue(id, loginParameter.getDevice(), loginParameter.getTimeout(), loginParameter.getExtraData());
// 4$$ 发布事件账号xxx 登录成功 // 4$$ 发布事件账号xxx 登录成功
SaTokenEventCenter.doLogin(loginType, id, tokenValue, loginModel); SaTokenEventCenter.doLogin(loginType, id, tokenValue, loginParameter);
// 5返回 // 5返回
return tokenValue; return tokenValue;

View File

@ -22,7 +22,7 @@ import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import cn.dev33.satoken.stp.SaLoginConfig; import cn.dev33.satoken.stp.SaLoginConfig;
import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.SaLoginParameter;
import cn.dev33.satoken.stp.SaTokenInfo; import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.util.SaTokenConsts; import cn.dev33.satoken.util.SaTokenConsts;
@ -65,7 +65,7 @@ public class TokenInfoTest {
} }
@Test @Test
public void testLoginModel() { public void testLoginParameter() {
Assertions.assertEquals(SaLoginConfig.setDevice("PC").getDevice(), "PC"); Assertions.assertEquals(SaLoginConfig.setDevice("PC").getDevice(), "PC");
Assertions.assertEquals(SaLoginConfig.setIsLastingCookie(false).getIsLastingCookie(), false); Assertions.assertEquals(SaLoginConfig.setIsLastingCookie(false).getIsLastingCookie(), false);
Assertions.assertEquals(SaLoginConfig.setTimeout(1600).getTimeout(), 1600); Assertions.assertEquals(SaLoginConfig.setTimeout(1600).getTimeout(), 1600);
@ -74,19 +74,19 @@ public class TokenInfoTest {
Map<String, Object> extraData = new HashMap<>(); Map<String, Object> extraData = new HashMap<>();
extraData.put("age", 20); extraData.put("age", 20);
SaLoginModel lm = SaLoginConfig.setExtraData(extraData); SaLoginParameter lm = SaLoginConfig.setExtraData(extraData);
Assertions.assertEquals(lm.getExtraData(), extraData); Assertions.assertEquals(lm.getExtraData(), extraData);
Assertions.assertEquals(lm.getExtra("age"), 20); Assertions.assertEquals(lm.getExtra("age"), 20);
Assertions.assertTrue(lm.isSetExtraData()); Assertions.assertTrue(lm.isSetExtraData());
Assertions.assertNotNull(lm.toString()); Assertions.assertNotNull(lm.toString());
// 计算 CookieTimeout // 计算 CookieTimeout
SaLoginModel loginModel = SaLoginModel SaLoginParameter loginParameter = SaLoginParameter
.create() .create()
.setTimeout(-1); .setTimeout(-1);
loginModel.build(); loginParameter.build();
Assertions.assertEquals(loginModel.getCookieTimeout(), Integer.MAX_VALUE); Assertions.assertEquals(loginParameter.getCookieTimeout(), Integer.MAX_VALUE);
Assertions.assertEquals(loginModel.getDeviceOrDefault(), SaTokenConsts.DEFAULT_LOGIN_DEVICE); Assertions.assertEquals(loginParameter.getDeviceOrDefault(), SaTokenConsts.DEFAULT_LOGIN_DEVICE);
} }
} }

View File

@ -26,7 +26,7 @@ import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.spring.SpringMVCUtil; import cn.dev33.satoken.spring.SpringMVCUtil;
import cn.dev33.satoken.spring.pathmatch.SaPathMatcherHolder; import cn.dev33.satoken.spring.pathmatch.SaPathMatcherHolder;
import cn.dev33.satoken.stp.SaLoginConfig; import cn.dev33.satoken.stp.SaLoginConfig;
import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.SaLoginParameter;
import cn.dev33.satoken.stp.StpLogic; import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaTokenConsts; import cn.dev33.satoken.util.SaTokenConsts;
@ -646,7 +646,7 @@ public class BasicsTest {
@Test @Test
public void testDoLoginBySetToken() { public void testDoLoginBySetToken() {
// 预定 Token 登录 // 预定 Token 登录
StpUtil.login(10001, new SaLoginModel().setToken("qwer-qwer-qwer-qwer")); StpUtil.login(10001, new SaLoginParameter().setToken("qwer-qwer-qwer-qwer"));
Assertions.assertEquals(StpUtil.getTokenValue(), "qwer-qwer-qwer-qwer"); Assertions.assertEquals(StpUtil.getTokenValue(), "qwer-qwer-qwer-qwer");
// 注销后应该清除Token // 注销后应该清除Token
@ -663,7 +663,7 @@ public class BasicsTest {
Assertions.assertNull(StpUtil.getTokenValue()); Assertions.assertNull(StpUtil.getTokenValue());
// 无上下文注入的登录 // 无上下文注入的登录
String token = StpUtil.createLoginSession(10001, new SaLoginModel()); String token = StpUtil.createLoginSession(10001, new SaLoginParameter());
Assertions.assertNull(StpUtil.getTokenValue()); Assertions.assertNull(StpUtil.getTokenValue());
// 手动写入 // 手动写入