update satoken 1.34.0 => 1.35.0.RC 优化过期配置 支持多端token自定义有效期

This commit is contained in:
疯狂的狮子Li 2023-06-25 22:19:27 +08:00
parent d7947b8be5
commit 8573ffdd7f
5 changed files with 26 additions and 14 deletions

View File

@ -24,7 +24,7 @@
<poi.version>5.2.3</poi.version> <poi.version>5.2.3</poi.version>
<easyexcel.version>3.3.1</easyexcel.version> <easyexcel.version>3.3.1</easyexcel.version>
<velocity.version>2.3</velocity.version> <velocity.version>2.3</velocity.version>
<satoken.version>1.34.0</satoken.version> <satoken.version>1.35.0.RC</satoken.version>
<mybatis-plus.version>3.5.3.1</mybatis-plus.version> <mybatis-plus.version>3.5.3.1</mybatis-plus.version>
<p6spy.version>3.9.1</p6spy.version> <p6spy.version>3.9.1</p6spy.version>
<hutool.version>5.8.18</hutool.version> <hutool.version>5.8.18</hutool.version>

View File

@ -98,8 +98,9 @@ sa-token:
token-name: Authorization token-name: Authorization
# token固定超时 设为七天 (必定过期) 单位: 秒 # token固定超时 设为七天 (必定过期) 单位: 秒
timeout: 604800 timeout: 604800
# token活跃超时时间 30分钟(指定时间无操作则过期) 单位: 秒 # 多端不同 token 有效期 可查看 LoginHelper.loginByDevice 方法自定义
activity-timeout: 1800 # token最低活跃时间 (指定时间无操作就过期) 单位: 秒
active-timeout: 1800
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
is-concurrent: true is-concurrent: true
# 在多人登录同一账号时是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) # 在多人登录同一账号时是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)

View File

@ -2,6 +2,7 @@ package org.dromara.common.satoken.utils;
import cn.dev33.satoken.context.SaHolder; import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.context.model.SaStorage; import cn.dev33.satoken.context.model.SaStorage;
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
@ -59,6 +60,14 @@ public class LoginHelper {
if (ObjectUtil.isNotNull(deviceType)) { if (ObjectUtil.isNotNull(deviceType)) {
model.setDevice(deviceType.getDevice()); model.setDevice(deviceType.getDevice());
} }
// 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置
// 例如: 后台用户30分钟过期 app用户1天过期
// UserType userType = UserType.getUserType(loginUser.getUserType());
// if (userType == UserType.SYS_USER) {
// model.setTimeout(86400).setActiveTimeout(1800);
// } else if (userType == UserType.APP_USER) {
// model.setTimeout(86400).setActiveTimeout(1800);
// }
StpUtil.login(loginUser.getLoginId(), StpUtil.login(loginUser.getLoginId(),
model.setExtra(TENANT_KEY, loginUser.getTenantId()) model.setExtra(TENANT_KEY, loginUser.getTenantId())
.setExtra(USER_KEY, loginUser.getUserId())); .setExtra(USER_KEY, loginUser.getUserId()));
@ -73,7 +82,11 @@ public class LoginHelper {
if (loginUser != null) { if (loginUser != null) {
return loginUser; return loginUser;
} }
loginUser = (LoginUser) StpUtil.getTokenSession().get(LOGIN_USER_KEY); SaSession session = StpUtil.getTokenSession();
if (ObjectUtil.isNull(session)) {
return null;
}
loginUser = (LoginUser) session.get(LOGIN_USER_KEY);
SaHolder.getStorage().set(LOGIN_USER_KEY, loginUser); SaHolder.getStorage().set(LOGIN_USER_KEY, loginUser);
return loginUser; return loginUser;
} }
@ -82,7 +95,11 @@ public class LoginHelper {
* 获取用户基于token * 获取用户基于token
*/ */
public static LoginUser getLoginUser(String token) { public static LoginUser getLoginUser(String token) {
return (LoginUser) StpUtil.getTokenSessionByToken(token).get(LOGIN_USER_KEY); SaSession session = StpUtil.getTokenSessionByToken(token);
if (ObjectUtil.isNull(session)) {
return null;
}
return (LoginUser) session.get(LOGIN_USER_KEY);
} }
/** /**
@ -164,9 +181,4 @@ public class LoginHelper {
public static boolean isTenantAdmin(Set<String> rolePermission) { public static boolean isTenantAdmin(Set<String> rolePermission) {
return rolePermission.contains(TenantConstants.TENANT_ADMIN_ROLE_KEY); return rolePermission.contains(TenantConstants.TENANT_ADMIN_ROLE_KEY);
} }
public static boolean isTenantAdmin() {
return isTenantAdmin(getLoginUser().getRolePermission());
}
} }

View File

@ -4,8 +4,8 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.CacheConstants; import org.dromara.common.core.constant.CacheConstants;
import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.dto.UserOnlineDTO; import org.dromara.common.core.domain.dto.UserOnlineDTO;
import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StreamUtils;
@ -16,7 +16,6 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.web.core.BaseController; import org.dromara.common.web.core.BaseController;
import org.dromara.system.domain.SysUserOnline; import org.dromara.system.domain.SysUserOnline;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.ArrayList; import java.util.ArrayList;
@ -48,7 +47,7 @@ public class SysUserOnlineController extends BaseController {
for (String key : keys) { for (String key : keys) {
String token = StringUtils.substringAfterLast(key, ":"); String token = StringUtils.substringAfterLast(key, ":");
// 如果已经过期则跳过 // 如果已经过期则跳过
if (StpUtil.stpLogic.getTokenActivityTimeoutByToken(token) < -1) { if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) < -1) {
continue; continue;
} }
userOnlineDTOList.add(RedisUtils.getCacheObject(CacheConstants.ONLINE_TOKEN_KEY + token)); userOnlineDTOList.add(RedisUtils.getCacheObject(CacheConstants.ONLINE_TOKEN_KEY + token));

View File

@ -461,7 +461,7 @@ public class SysRoleServiceImpl implements ISysRoleService {
keys.parallelStream().forEach(key -> { keys.parallelStream().forEach(key -> {
String token = StringUtils.substringAfterLast(key, ":"); String token = StringUtils.substringAfterLast(key, ":");
// 如果已经过期则跳过 // 如果已经过期则跳过
if (StpUtil.stpLogic.getTokenActivityTimeoutByToken(token) < -1) { if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) < -1) {
return; return;
} }
LoginUser loginUser = LoginHelper.getLoginUser(token); LoginUser loginUser = LoginHelper.getLoginUser(token);