From 8c6ed6820e53c27fa40973da285fd39a66424540 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期三, 07 五月 2025 14:03:08 +0800
Subject: [PATCH] 提交等保部分功能修改

---
 ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java                              |    6 +++
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java          |    2 
 ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java |   13 +++++-
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/RuoYiSystemApplication.java                |    2 +
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/TaskUtil.java                         |   60 ++++++++++++++++++++++++++++++
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java                                 |   25 ++++++++++++
 6 files changed, 104 insertions(+), 4 deletions(-)

diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
index da2ac38..c6928db 100644
--- a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
+++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
@@ -67,6 +67,12 @@
 			Partner partner = partnerClient.getPartnerById(userInfo.getSysUser().getObjectId()).getData();
 			map.put("partnerName", partner.getName());
 		}
+		long time = userInfo.getSysUser().getPassWordUpdate().getTime();
+		map.put("password", false);
+		//30天提示修改密码
+		if(System.currentTimeMillis() >= (time + 2592000000L)){
+			map.put("password", true);
+		}
 		// 修改用户最后登录时间
 		SysUser sysUser = new SysUser();
 		sysUser.setUserId(userInfo.getSysUser().getUserId());
diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java
index d30a11f..432952c 100644
--- a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java
+++ b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java
@@ -62,9 +62,12 @@
 		claimsMap.put(SecurityConstants.USER_TYPE, "system");
 		claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName);
 		
+		String token1 = JwtUtils.createToken(claimsMap);
+		String userKey = getUserKey(loginUser.getUserid());
+		redisService.setCacheObject(userKey, token1, expireTime, TimeUnit.MINUTES);
 		// 接口返回信息
 		Map<String, Object> rspMap = new HashMap<String, Object>();
-		rspMap.put("access_token", JwtUtils.createToken(claimsMap));
+		rspMap.put("access_token", token1);
 		rspMap.put("expires_in", expireTime);
 		return rspMap;
 	}
@@ -208,8 +211,8 @@
 		loginUser.setLoginTime(System.currentTimeMillis());
 		loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
 		// 根据uuid将loginUser缓存
-		String userKey = getTokenKey(loginUser.getToken());
-		redisService.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
+		String tokenKey = getTokenKey(loginUser.getToken());
+		redisService.setCacheObject(tokenKey, loginUser, expireTime, TimeUnit.MINUTES);
 	}
 	
 	public void refreshToken1(LoginUserApplet dto) {
@@ -223,4 +226,8 @@
 	private String getTokenKey(String token) {
 		return ACCESS_TOKEN + token;
 	}
+	
+	private String getUserKey(Long userid) {
+		return ACCESS_TOKEN + userid;
+	}
 }
\ No newline at end of file
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java
index ff02153..692591f 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java
@@ -25,6 +25,7 @@
 import io.jsonwebtoken.Claims;
 import reactor.core.publisher.Mono;
 
+import java.time.LocalDateTime;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -86,6 +87,10 @@
 		addHeader(mutate, SecurityConstants.DETAILS_USER_ID, userid);
 		addHeader(mutate, SecurityConstants.DETAILS_USERNAME, username);
 		addHeader(mutate, SecurityConstants.USER_TYPE, userType);
+		//管理后台记录用户最后一次的操作时间,用于判定30分钟无操作后删除token,退出登录
+		if("system".equals(userType)){
+			addLastTime(userid, url);
+		}
 		// 内部请求来源参数清除
 		removeHeader(mutate, SecurityConstants.FROM_SOURCE);
 		return chain.filter(exchange.mutate().request(mutate.build()).build());
@@ -109,6 +114,26 @@
 		return ServletUtils.webFluxResponseWriter(exchange.getResponse(), msg, HttpStatus.UNAUTHORIZED);
 	}
 	
+	
+	/**
+	 * 记录用户最后一次操作的时间
+	 * @param userid
+	 * @param url
+	 */
+	private void addLastTime(String userid, String url){
+		Object lastTime = redisService.getCacheObject("lastTime:" + userid);
+		if(null == lastTime){
+			redisService.setCacheObject("lastTime:" + userid, System.currentTimeMillis());
+		}else{
+			Long last = Long.valueOf(lastTime.toString());
+			//操作登录或者时间差值小于30分钟,写入新的数据到缓存中
+			if("/auth/login".equals(url) || System.currentTimeMillis() - last < 1800000L){
+				redisService.setCacheObject("lastTime:" + userid, System.currentTimeMillis());
+			}
+		}
+	}
+	
+	
 	/**
 	 * 获取缓存key
 	 */
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/RuoYiSystemApplication.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/RuoYiSystemApplication.java
index 3fc922f..c23ae19 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/RuoYiSystemApplication.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/RuoYiSystemApplication.java
@@ -7,6 +7,7 @@
 import com.ruoyi.common.security.annotation.EnableRyFeignClients;
 import com.ruoyi.common.swagger.annotation.EnableCustomSwagger2;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 /**
@@ -18,6 +19,7 @@
 @MapperScan({"com.ruoyi.system.mapper"})
 @EnableCustomSwagger2
 @EnableRyFeignClients
+@EnableScheduling//开启定时任务
 @SpringBootApplication
 @EnableTransactionManagement
 public class RuoYiSystemApplication
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
index e14b510..acca8a1 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
@@ -130,6 +130,7 @@
         user.setCreateBy(SecurityUtils.getUsername());
         user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
         user.setRoleType(1);
+        user.setPassWordUpdate(new Date());
         userService.insertUser(user);
         SysUserRole sysUserRole = new SysUserRole();
         sysUserRole.setRoleId(user.getRoleId());
@@ -503,7 +504,6 @@
         sysUserVo.setSysUser(sysUser);
         sysUserVo.setRoles(roles);
         sysUserVo.setPermissions(permissions);
-
         return R.ok(sysUserVo);
     }
 
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/TaskUtil.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/TaskUtil.java
new file mode 100644
index 0000000..31c030d
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/TaskUtil.java
@@ -0,0 +1,60 @@
+package com.ruoyi.system.util;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.common.core.utils.JwtUtils;
+import com.ruoyi.common.redis.service.RedisService;
+import com.ruoyi.common.security.auth.AuthUtil;
+import com.ruoyi.system.api.domain.SysUser;
+import com.ruoyi.system.service.ISysUserService;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/11 8:39
+ */
+@Component
+public class TaskUtil {
+    
+    @Resource
+    private ISysUserService sysUserService;
+    
+    @Resource
+    private RedisService redisService;
+    
+    
+    /**
+     * 每分钟检测后台用户是否有30分钟未进行操作
+     */
+    @Scheduled(fixedRate = 60000)
+    public void taskLogout() {
+        List<SysUser> list = sysUserService.list(new LambdaQueryWrapper<SysUser>().eq(SysUser::getDelFlag, "0").eq(SysUser::getStatus, "0"));
+        for (SysUser sysUser : list) {
+            Object lastTime = redisService.getCacheObject("lastTime:" + sysUser.getUserId());
+            if(null == lastTime){
+                Object cacheObject = redisService.getCacheObject("login_tokens:" + sysUser.getUserId());
+                if(null != cacheObject){
+                    String token = cacheObject.toString();
+                    // 删除用户缓存记录
+                    AuthUtil.logoutByToken(token);
+                }
+            }else{
+                Long last = Long.valueOf(lastTime.toString());
+                //操作登录或者时间差值小于30分钟,写入新的数据到缓存中
+                if(System.currentTimeMillis() - last >= 1800000L){
+                    Object cacheObject = redisService.getCacheObject("login_tokens:" + sysUser.getUserId());
+                    if(null != cacheObject){
+                        String token = cacheObject.toString();
+                        // 删除用户缓存记录
+                        AuthUtil.logoutByToken(token);
+                    }
+                }
+            }
+        }
+    }
+
+}

--
Gitblit v1.7.1