pom.xml
@@ -24,7 +24,7 @@ <poi.version>5.2.3</poi.version> <easyexcel.version>3.3.1</easyexcel.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> <p6spy.version>3.9.1</p6spy.version> <hutool.version>5.8.18</hutool.version> ruoyi-admin/src/main/resources/application.yml
@@ -98,8 +98,9 @@ token-name: Authorization # token固定超时 设为七天 (必定过期) 单位: 秒 timeout: 604800 # token活跃超时时间 30分钟(指定时间无操作则过期) 单位: 秒 activity-timeout: 1800 # 多端不同 token 有效期 可查看 LoginHelper.loginByDevice 方法自定义 # token最低活跃时间 (指定时间无操作就过期) 单位: 秒 active-timeout: 1800 # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) is-concurrent: true # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java
@@ -2,6 +2,7 @@ import cn.dev33.satoken.context.SaHolder; import cn.dev33.satoken.context.model.SaStorage; import cn.dev33.satoken.session.SaSession; import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.convert.Convert; @@ -59,6 +60,14 @@ if (ObjectUtil.isNotNull(deviceType)) { 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(), model.setExtra(TENANT_KEY, loginUser.getTenantId()) .setExtra(USER_KEY, loginUser.getUserId())); @@ -73,7 +82,11 @@ if (loginUser != null) { 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); return loginUser; } @@ -82,7 +95,11 @@ * 获取用户基于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 static boolean isTenantAdmin(Set<String> rolePermission) { return rolePermission.contains(TenantConstants.TENANT_ADMIN_ROLE_KEY); } public static boolean isTenantAdmin() { return isTenantAdmin(getLoginUser().getRolePermission()); } } ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java
@@ -4,8 +4,8 @@ import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.bean.BeanUtil; import lombok.RequiredArgsConstructor; 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.dto.UserOnlineDTO; import org.dromara.common.core.utils.StreamUtils; @@ -16,7 +16,6 @@ import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.web.core.BaseController; import org.dromara.system.domain.SysUserOnline; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; @@ -48,7 +47,7 @@ for (String key : keys) { String token = StringUtils.substringAfterLast(key, ":"); // 如果已经过期则跳过 if (StpUtil.stpLogic.getTokenActivityTimeoutByToken(token) < -1) { if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) < -1) { continue; } userOnlineDTOList.add(RedisUtils.getCacheObject(CacheConstants.ONLINE_TOKEN_KEY + token)); ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java
@@ -461,7 +461,7 @@ keys.parallelStream().forEach(key -> { String token = StringUtils.substringAfterLast(key, ":"); // 如果已经过期则跳过 if (StpUtil.stpLogic.getTokenActivityTimeoutByToken(token) < -1) { if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) < -1) { return; } LoginUser loginUser = LoginHelper.getLoginUser(token);