mirror of
https://gitee.com/dromara/sa-token.git
synced 2025-04-24 18:04:47 +08:00
!159 登陆接口增加指定会话过期时间
Merge pull request !159 from java_long/feat_login_timout
This commit is contained in:
commit
4419ecd8e0
@ -1,10 +1,5 @@
|
||||
package cn.dev33.satoken.stp;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import cn.dev33.satoken.SaManager;
|
||||
import cn.dev33.satoken.annotation.SaCheckLogin;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
@ -32,6 +27,11 @@ import cn.dev33.satoken.strategy.SaStrategy;
|
||||
import cn.dev33.satoken.util.SaFoxUtil;
|
||||
import cn.dev33.satoken.util.SaTokenConsts;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Sa-Token 权限认证,逻辑实现类
|
||||
* @author kong
|
||||
@ -270,6 +270,16 @@ public class StpLogic {
|
||||
login(id, new SaLoginModel().setIsLastingCookie(isLastingCookie));
|
||||
}
|
||||
|
||||
/**
|
||||
* 会话登录,并指定此次登录token的有效期, 单位:秒
|
||||
*
|
||||
* @param id 账号id,建议的类型:(long | int | String)
|
||||
* @param timeout 此次登录token的有效期, 单位:秒
|
||||
*/
|
||||
public void login(Object id, long timeout) {
|
||||
login(id, new SaLoginModel().setTimeout(timeout));
|
||||
}
|
||||
|
||||
/**
|
||||
* 会话登录,并指定所有登录参数Model
|
||||
* @param id 登录id,建议的类型:(long | int | String)
|
||||
@ -318,7 +328,7 @@ public class StpLogic {
|
||||
// 如果配置为共享token, 则尝试从Session签名记录里取出token
|
||||
if(getConfigOfIsShare()) {
|
||||
// 为确保 jwt-simple 模式的 token Extra 数据生成不受旧token影响,这里必须确保 is-share 配置项在 ExtraData 为空时才可以生效
|
||||
// 即:在 login 时提供了 Extra 数据后,即使配置了 is-share=true 也不能复用旧 Token,必须创建新 Token
|
||||
// 即:在 login 时提供了 Extra 数据后,即使配置了 is-share=true 也不能复用旧 Token,必须创建新 Token
|
||||
if(loginModel.getExtraData() == null || loginModel.getExtraData().size() == 0) {
|
||||
tokenValue = getTokenValueByLoginId(id, loginModel.getDeviceOrDefault());
|
||||
}
|
||||
@ -370,24 +380,24 @@ public class StpLogic {
|
||||
* 会话注销
|
||||
*/
|
||||
public void logout() {
|
||||
// 如果连 Token 都没有,那么无需执行任何操作
|
||||
// 如果连 Token 都没有,那么无需执行任何操作
|
||||
String tokenValue = getTokenValue();
|
||||
if(SaFoxUtil.isEmpty(tokenValue)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 如果打开了 Cookie 模式,则把 Cookie 清除掉
|
||||
// 如果打开了 Cookie 模式,则把 Cookie 清除掉
|
||||
if(getConfig().getIsReadCookie()){
|
||||
SaHolder.getResponse().deleteCookie(getTokenName());
|
||||
}
|
||||
|
||||
// 从当前 [Storage存储器] 里删除 Token
|
||||
// 从当前 [Storage存储器] 里删除 Token
|
||||
SaHolder.getStorage().delete(splicingKeyJustCreatedSave());
|
||||
|
||||
// 清除当前上下文的 [临时有效期check标记]
|
||||
|
||||
// 清除当前上下文的 [临时有效期check标记]
|
||||
SaHolder.getStorage().delete(SaTokenConsts.TOKEN_ACTIVITY_TIMEOUT_CHECKED_KEY);
|
||||
|
||||
// 清除这个 Token 的相关信息
|
||||
|
||||
// 清除这个 Token 的相关信息
|
||||
logoutByTokenValue(tokenValue);
|
||||
}
|
||||
|
||||
@ -471,13 +481,13 @@ public class StpLogic {
|
||||
// 2. 注销 Token-Session
|
||||
deleteTokenSession(tokenValue);
|
||||
|
||||
// 3. 清理 token -> id 索引
|
||||
// 3. 清理 token -> id 索引
|
||||
String loginId = getLoginIdNotHandle(tokenValue);
|
||||
if(loginId != null) {
|
||||
deleteTokenToIdMapping(tokenValue);
|
||||
}
|
||||
|
||||
// if. 无效 loginId 立即返回
|
||||
// if. 无效 loginId 立即返回
|
||||
if(isValidLoginId(loginId) == false) {
|
||||
return;
|
||||
}
|
||||
@ -756,14 +766,14 @@ public class StpLogic {
|
||||
|
||||
/**
|
||||
* 获取指定 Token 的扩展信息(此函数只在jwt模式下生效)
|
||||
* @param tokenValue 指定的 Token 值
|
||||
* @param key 键值
|
||||
* @return 对应的扩展数据
|
||||
* @param tokenValue 指定的 Token 值
|
||||
* @param key 键值
|
||||
* @return 对应的扩展数据
|
||||
*/
|
||||
public Object getExtra(String tokenValue, String key) {
|
||||
throw new ApiDisabledException();
|
||||
}
|
||||
|
||||
|
||||
|
||||
// ---- 其它操作
|
||||
/**
|
||||
@ -892,7 +902,7 @@ public class StpLogic {
|
||||
* @return Session对象
|
||||
*/
|
||||
public SaSession getTokenSession(boolean isCreate) {
|
||||
// Token 为空的情况下直接返回 null
|
||||
// Token 为空的情况下直接返回 null
|
||||
String tokenValue = getTokenValue();
|
||||
if(SaFoxUtil.isEmpty(tokenValue)) {
|
||||
return null;
|
||||
@ -900,35 +910,35 @@ public class StpLogic {
|
||||
// 如果配置了需要校验登录状态,则验证一下
|
||||
if(getConfig().getTokenSessionCheckLogin()) {
|
||||
checkLogin();
|
||||
}
|
||||
// 获取 SaSession 数据
|
||||
}
|
||||
// 获取 SaSession 数据
|
||||
return getTokenSessionByToken(tokenValue, isCreate);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
/**
|
||||
* 获取当前Token-Session,如果Session尚未创建,则新建并返回
|
||||
* @return Session对象
|
||||
* @return Session对象
|
||||
*/
|
||||
public SaSession getTokenSession() {
|
||||
return getTokenSession(true);
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* 获取当前匿名 Token-Session (可在未登录情况下使用的Token-Session)
|
||||
* @param isCreate 在 Token-Session 尚未创建的情况是否新建并返回
|
||||
* @return Token-Session 对象
|
||||
* @param isCreate 在 Token-Session 尚未创建的情况是否新建并返回
|
||||
* @return Token-Session 对象
|
||||
*/
|
||||
public SaSession getAnonTokenSession(boolean isCreate) {
|
||||
/*
|
||||
/*
|
||||
* 情况1、如果调用方提供了有效 Token,则:直接返回其 [Token-Session]
|
||||
* 情况2、如果调用方提供了无效 Token,或根本没有提供 Token,则:创建新 Token -> 返回 [Token-Session]
|
||||
* 情况2、如果调用方提供了无效 Token,或根本没有提供 Token,则:创建新 Token -> 返回 [Token-Session]
|
||||
*/
|
||||
String tokenValue = getTokenValue();
|
||||
|
||||
|
||||
// q1 —— 判断这个 Token 是否有效,两个条件符合其一即可:
|
||||
/*
|
||||
* 条件1、能查出 Token-Session
|
||||
* 条件2、能查出 LoginId
|
||||
* 条件1、能查出 Token-Session
|
||||
* 条件2、能查出 LoginId
|
||||
*/
|
||||
if(SaFoxUtil.isNotEmpty(tokenValue)) {
|
||||
// 符合条件1
|
||||
@ -936,28 +946,28 @@ public class StpLogic {
|
||||
if(session != null) {
|
||||
return session;
|
||||
}
|
||||
// 符合条件2
|
||||
// 符合条件2
|
||||
String loginId = getLoginIdNotHandle(tokenValue);
|
||||
if(isValidLoginId(loginId)) {
|
||||
return getTokenSessionByToken(tokenValue, isCreate);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// q2 —— 此时q2分两种情况:
|
||||
/*
|
||||
* 情况 2.1、isCreate=true:说明调用方想让框架帮其创建一个 SaSession,那框架就创建并返回
|
||||
* 情况 2.2、isCreate=false:说明调用方并不想让框架帮其创建一个 SaSession,那框架就直接返回 null
|
||||
* 情况 2.1、isCreate=true:说明调用方想让框架帮其创建一个 SaSession,那框架就创建并返回
|
||||
* 情况 2.2、isCreate=false:说明调用方并不想让框架帮其创建一个 SaSession,那框架就直接返回 null
|
||||
*/
|
||||
if(isCreate) {
|
||||
// 随机创建一个 Token
|
||||
// 随机创建一个 Token
|
||||
tokenValue = createTokenValue(null, null, getConfig().getTimeout(), null);
|
||||
// 写入 [最后操作时间]
|
||||
setLastActivityToNow(tokenValue);
|
||||
// 在当前上下文写入此 TokenValue
|
||||
// 写入 [最后操作时间]
|
||||
setLastActivityToNow(tokenValue);
|
||||
// 在当前上下文写入此 TokenValue
|
||||
setTokenValue(tokenValue);
|
||||
// 返回其 Token-Session 对象
|
||||
// 返回其 Token-Session 对象
|
||||
return getTokenSessionByToken(tokenValue, isCreate);
|
||||
}
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
@ -965,7 +975,7 @@ public class StpLogic {
|
||||
|
||||
/**
|
||||
* 获取当前匿名 Token-Session (可在未登录情况下使用的Token-Session)
|
||||
* @return Token-Session 对象
|
||||
* @return Token-Session 对象
|
||||
*/
|
||||
public SaSession getAnonTokenSession() {
|
||||
return getAnonTokenSession(true);
|
||||
@ -995,7 +1005,7 @@ public class StpLogic {
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除指定 Token 的 [最后操作时间记录]
|
||||
* 清除指定 Token 的 [最后操作时间记录]
|
||||
* @param tokenValue 指定token
|
||||
*/
|
||||
protected void clearLastActivity(String tokenValue) {
|
||||
@ -1531,8 +1541,8 @@ public class StpLogic {
|
||||
* @param start 开始处索引 (-1代表查询所有)
|
||||
* @param size 获取数量
|
||||
* @param sortType 排序类型(true=正序,false=反序)
|
||||
*
|
||||
* @return token集合
|
||||
*
|
||||
* @return token集合
|
||||
*/
|
||||
public List<String> searchTokenValue(String keyword, int start, int size, boolean sortType) {
|
||||
return getSaTokenDao().searchData(splicingKeyTokenValue(""), keyword, start, size, sortType);
|
||||
@ -1544,8 +1554,8 @@ public class StpLogic {
|
||||
* @param start 开始处索引 (-1代表查询所有)
|
||||
* @param size 获取数量
|
||||
* @param sortType 排序类型(true=正序,false=反序)
|
||||
*
|
||||
* @return sessionId集合
|
||||
*
|
||||
* @return sessionId集合
|
||||
*/
|
||||
public List<String> searchSessionId(String keyword, int start, int size, boolean sortType) {
|
||||
return getSaTokenDao().searchData(splicingKeySession(""), keyword, start, size, sortType);
|
||||
@ -1557,8 +1567,8 @@ public class StpLogic {
|
||||
* @param start 开始处索引 (-1代表查询所有)
|
||||
* @param size 获取数量
|
||||
* @param sortType 排序类型(true=正序,false=反序)
|
||||
*
|
||||
* @return sessionId集合
|
||||
*
|
||||
* @return sessionId集合
|
||||
*/
|
||||
public List<String> searchTokenSessionId(String keyword, int start, int size, boolean sortType) {
|
||||
return getSaTokenDao().searchData(splicingKeyTokenSession(""), keyword, start, size, sortType);
|
||||
@ -1633,12 +1643,12 @@ public class StpLogic {
|
||||
* @param disableTime 封禁时间, 单位: 秒 (-1=永久封禁)
|
||||
*/
|
||||
public void disable(Object loginId, long disableTime) {
|
||||
// 空值不做处理
|
||||
// 空值不做处理
|
||||
if(SaFoxUtil.isEmpty(loginId)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 标注为已被封禁
|
||||
|
||||
// 标注为已被封禁
|
||||
getSaTokenDao().set(splicingKeyDisable(loginId), DisableLoginException.BE_VALUE, disableTime);
|
||||
|
||||
// $$ 通知监听器
|
||||
@ -1878,7 +1888,7 @@ public class StpLogic {
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回全局配置的 Cookie 保存时长,单位:秒 (根据全局 timeout 计算)
|
||||
* 返回全局配置的 Cookie 保存时长,单位:秒 (根据全局 timeout 计算)
|
||||
* @return Cookie 应该保存的时长
|
||||
*/
|
||||
public int getConfigOfCookieTimeout() {
|
||||
@ -1888,8 +1898,8 @@ public class StpLogic {
|
||||
}
|
||||
return (int) timeout;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 返回持久化对象
|
||||
* @return /
|
||||
|
@ -1,11 +1,11 @@
|
||||
package cn.dev33.satoken.stp;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import cn.dev33.satoken.SaManager;
|
||||
import cn.dev33.satoken.fun.SaFunction;
|
||||
import cn.dev33.satoken.session.SaSession;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Sa-Token 权限认证工具类
|
||||
* @author kong
|
||||
@ -121,18 +121,30 @@ public class StpUtil {
|
||||
}
|
||||
|
||||
/**
|
||||
* 会话登录,并指定是否 [记住我]
|
||||
* @param id 账号id,建议的类型:(long | int | String)
|
||||
* @param isLastingCookie 是否为持久Cookie
|
||||
* 会话登录,并指定是否 [记住我]
|
||||
*
|
||||
* @param id 账号id,建议的类型:(long | int | String)
|
||||
* @param isLastingCookie 是否为持久Cookie
|
||||
*/
|
||||
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的有效期, 单位:秒 (如未指定,自动取全局配置的timeout值)
|
||||
*/
|
||||
public static void login(Object id, Long timeout) {
|
||||
stpLogic.login(id, timeout);
|
||||
}
|
||||
|
||||
/**
|
||||
* 会话登录,并指定所有登录参数Model
|
||||
*
|
||||
* @param id 登录id,建议的类型:(long | int | String)
|
||||
* @param loginModel 此次登录的参数Model
|
||||
*/
|
||||
public static void login(Object id, SaLoginModel loginModel) {
|
||||
stpLogic.login(id, loginModel);
|
||||
|
Loading…
Reference in New Issue
Block a user