From ecb9599b25fde0e3569b46e667ca1990294f8665 Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: Tue, 16 Dec 2025 10:26:21 +0800
Subject: [PATCH] 修复【在线用户强制退出正在使用的账号】bug

---
 ard-framework/src/main/java/com/ard/framework/web/service/TokenService.java |   32 ++++++++++++++++++++++++++++++--
 1 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/ard-framework/src/main/java/com/ard/framework/web/service/TokenService.java b/ard-framework/src/main/java/com/ard/framework/web/service/TokenService.java
index 5250cf1..682a1ab 100644
--- a/ard-framework/src/main/java/com/ard/framework/web/service/TokenService.java
+++ b/ard-framework/src/main/java/com/ard/framework/web/service/TokenService.java
@@ -26,7 +26,7 @@
 /**
  * token验证处理
  *
- * @author ruoyi
+ * @author ard
  */
 @Component
 public class TokenService
@@ -44,6 +44,10 @@
     // 令牌有效期(默认30分钟)
     @Value("${token.expireTime}")
     private int expireTime;
+
+    // 是否允许账户多终端同时登录(true允许 false不允许)
+    @Value("${token.soloLogin}")
+    private boolean soloLogin;
 
     protected static final long MILLIS_SECOND = 1000;
 
@@ -96,12 +100,17 @@
     /**
      * 删除用户身份信息
      */
-    public void delLoginUser(String token)
+    public void delLoginUser(String token, Long userId)
     {
         if (StringUtils.isNotEmpty(token))
         {
             String userKey = getTokenKey(token);
             redisCache.deleteObject(userKey);
+        }
+        if (!soloLogin && StringUtils.isNotNull(userId))
+        {
+            String userIdKey = getUserIdKey(userId);
+            redisCache.deleteObject(userIdKey);
         }
     }
 
@@ -151,6 +160,12 @@
         // 根据uuid将loginUser缓存
         String userKey = getTokenKey(loginUser.getToken());
         redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
+        if (!soloLogin)
+        {
+            // 缓存用户唯一标识,防止同一帐号,同时登录
+            String userIdKey = getUserIdKey(loginUser.getUser().getUserId());
+            redisCache.setCacheObject(userIdKey, userKey, expireTime, TimeUnit.MINUTES);
+        }
     }
 
     /**
@@ -228,4 +243,17 @@
     {
         return CacheConstants.LOGIN_TOKEN_KEY + uuid;
     }
+
+    private String getUserIdKey(Long userId)
+    {
+        return CacheConstants.LOGIN_USERID_KEY + userId;
+    }
+
+    public LoginUser getLoginUserByUserId(Long userId) {
+        String userIdKey = getUserIdKey(userId);
+        String tokenKey = redisCache.getCacheObject(userIdKey);
+        if (tokenKey == null) return null;
+        return redisCache.getCacheObject(tokenKey);
+    }
+
 }

--
Gitblit v1.9.3