From 131b6c120db336ca5c2052b877be90ee201614db Mon Sep 17 00:00:00 2001
From: ‘liusuyi’ <1951119284@qq.com>
Date: 星期六, 13 一月 2024 09:24:51 +0800
Subject: [PATCH] 增加账户互踢

---
 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java |  132 +++++++++++++++++++++++++++----------------
 1 files changed, 83 insertions(+), 49 deletions(-)

diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java
index 710b5d3..07ecf89 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java
@@ -4,6 +4,7 @@
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import javax.servlet.http.HttpServletRequest;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
@@ -27,8 +28,7 @@
  * @author ruoyi
  */
 @Component
-public class TokenService
-{
+public class TokenService {
     // 浠ょ墝鑷畾涔夋爣璇�
     @Value("${token.header}")
     private String header;
@@ -40,6 +40,10 @@
     // 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
     @Value("${token.expireTime}")
     private int expireTime;
+
+    // 鏄惁鍏佽璐︽埛澶氱粓绔悓鏃剁櫥褰曪紙true鍏佽 false涓嶅厑璁革級
+    @Value("${token.soloLogin}")
+    private boolean soloLogin;
 
     protected static final long MILLIS_SECOND = 1000;
 
@@ -55,23 +59,18 @@
      *
      * @return 鐢ㄦ埛淇℃伅
      */
-    public LoginUser getLoginUser(HttpServletRequest request)
-    {
+    public LoginUser getLoginUser(HttpServletRequest request) {
         // 鑾峰彇璇锋眰鎼哄甫鐨勪护鐗�
         String token = getToken(request);
-        if (StringUtils.isNotEmpty(token))
-        {
-            try
-            {
+        if (StringUtils.isNotEmpty(token)) {
+            try {
                 Claims claims = parseToken(token);
                 // 瑙f瀽瀵瑰簲鐨勬潈闄愪互鍙婄敤鎴蜂俊鎭�
                 String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
                 String userKey = getTokenKey(uuid);
                 LoginUser user = redisCache.getCacheObject(userKey);
                 return user;
-            }
-            catch (Exception e)
-            {
+            } catch (Exception e) {
             }
         }
         return null;
@@ -80,24 +79,40 @@
     /**
      * 璁剧疆鐢ㄦ埛韬唤淇℃伅
      */
-    public void setLoginUser(LoginUser loginUser)
-    {
-        if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken()))
-        {
+    public void setLoginUser(LoginUser loginUser) {
+        if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) {
             refreshToken(loginUser);
         }
     }
 
+    ///**
+    // * 鍒犻櫎鐢ㄦ埛韬唤淇℃伅
+    // */
+    //public void delLoginUser(String token)
+    //{
+    //    if (StringUtils.isNotEmpty(token))
+    //    {
+    //        String userKey = getTokenKey(token);
+    //        redisCache.deleteObject(userKey);
+    //    }
+    //}
+
     /**
      * 鍒犻櫎鐢ㄦ埛韬唤淇℃伅
      */
-    public void delLoginUser(String token)
-    {
-        if (StringUtils.isNotEmpty(token))
-        {
+    public void delLoginUser(String token, String userId) {
+        if (StringUtils.isNotEmpty(token)) {
             String userKey = getTokenKey(token);
             redisCache.deleteObject(userKey);
         }
+        if (!soloLogin && StringUtils.isNotNull(userId)) {
+            String userIdKey = getUserIdKey(userId);
+            redisCache.deleteObject(userIdKey);
+        }
+    }
+
+    private String getUserIdKey(String userId) {
+        return Constants.LOGIN_USERID_KEY + userId;
     }
 
     /**
@@ -106,8 +121,7 @@
      * @param loginUser 鐢ㄦ埛淇℃伅
      * @return 浠ょ墝
      */
-    public String createToken(LoginUser loginUser)
-    {
+    public String createToken(LoginUser loginUser) {
         String token = IdUtils.fastUUID();
         loginUser.setToken(token);
         setUserAgent(loginUser);
@@ -124,40 +138,67 @@
      * @param loginUser
      * @return 浠ょ墝
      */
-    public void verifyToken(LoginUser loginUser)
-    {
+    public void verifyToken(LoginUser loginUser) {
         long expireTime = loginUser.getExpireTime();
         long currentTime = System.currentTimeMillis();
-        if (expireTime - currentTime <= MILLIS_MINUTE_TEN)
-        {
+        if (expireTime - currentTime <= MILLIS_MINUTE_TEN) {
             refreshToken(loginUser);
         }
     }
+
+    ///**
+    // * 鍒锋柊浠ょ墝鏈夋晥鏈�
+    // *
+    // * @param loginUser 鐧诲綍淇℃伅
+    // */
+    //public void refreshToken(LoginUser loginUser)
+    //{
+    //    loginUser.setLoginTime(System.currentTimeMillis());
+    //    String appUserType = loginUser.getUser().getAppUserType();
+    //    if(StringUtils.isNull(appUserType))
+    //    {
+    //        loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
+    //        // 鏍规嵁uuid灏唋oginUser缂撳瓨
+    //        String userKey = getTokenKey(loginUser.getToken());
+    //        redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
+    //    }
+    //    else
+    //    {
+    //        loginUser.setExpireTime(loginUser.getLoginTime() + 365*24*60 * MILLIS_MINUTE);
+    //        // 鏍规嵁uuid灏唋oginUser缂撳瓨
+    //        String userKey = getTokenKey(loginUser.getToken());
+    //        redisCache.setCacheObject(userKey, loginUser, 365*24*60, TimeUnit.MINUTES);
+    //    }
+    //}
 
     /**
      * 鍒锋柊浠ょ墝鏈夋晥鏈�
      *
      * @param loginUser 鐧诲綍淇℃伅
      */
-    public void refreshToken(LoginUser loginUser)
-    {
+    public void refreshToken(LoginUser loginUser) {
         loginUser.setLoginTime(System.currentTimeMillis());
+        loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
+        // 鏍规嵁uuid灏唋oginUser缂撳瓨
+        //String userKey = getTokenKey(loginUser.getToken());
+        //redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
         String appUserType = loginUser.getUser().getAppUserType();
-        if(StringUtils.isNull(appUserType))
-        {
+        if (StringUtils.isNull(appUserType)) {
             loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
             // 鏍规嵁uuid灏唋oginUser缂撳瓨
             String userKey = getTokenKey(loginUser.getToken());
             redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
-        }
-        else
-        {
-            loginUser.setExpireTime(loginUser.getLoginTime() + 365*24*60 * MILLIS_MINUTE);
+            if (!soloLogin) {
+                // 缂撳瓨鐢ㄦ埛鍞竴鏍囪瘑锛岄槻姝㈠悓涓�甯愬彿锛屽悓鏃剁櫥褰�
+                String userIdKey = getUserIdKey(loginUser.getUser().getUserId());
+                redisCache.setCacheObject(userIdKey, userKey, expireTime, TimeUnit.MINUTES);
+            }
+        } else {
+            loginUser.setExpireTime(loginUser.getLoginTime() + 365 * 24 * 60 * MILLIS_MINUTE);
             // 鏍规嵁uuid灏唋oginUser缂撳瓨
             String userKey = getTokenKey(loginUser.getToken());
-            redisCache.setCacheObject(userKey, loginUser, 365*24*60, TimeUnit.MINUTES);
+            redisCache.setCacheObject(userKey, loginUser, 365 * 24 * 60, TimeUnit.MINUTES);
         }
-
     }
 
     /**
@@ -165,8 +206,7 @@
      *
      * @param loginUser 鐧诲綍淇℃伅
      */
-    public void setUserAgent(LoginUser loginUser)
-    {
+    public void setUserAgent(LoginUser loginUser) {
         UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
         String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
         loginUser.setIpaddr(ip);
@@ -181,8 +221,7 @@
      * @param claims 鏁版嵁澹版槑
      * @return 浠ょ墝
      */
-    private String createToken(Map<String, Object> claims)
-    {
+    private String createToken(Map<String, Object> claims) {
         String token = Jwts.builder()
                 .setClaims(claims)
                 .signWith(SignatureAlgorithm.HS512, secret).compact();
@@ -195,8 +234,7 @@
      * @param token 浠ょ墝
      * @return 鏁版嵁澹版槑
      */
-    private Claims parseToken(String token)
-    {
+    private Claims parseToken(String token) {
         return Jwts.parser()
                 .setSigningKey(secret)
                 .parseClaimsJws(token)
@@ -209,8 +247,7 @@
      * @param token 浠ょ墝
      * @return 鐢ㄦ埛鍚�
      */
-    public String getUsernameFromToken(String token)
-    {
+    public String getUsernameFromToken(String token) {
         Claims claims = parseToken(token);
         return claims.getSubject();
     }
@@ -221,18 +258,15 @@
      * @param request
      * @return token
      */
-    private String getToken(HttpServletRequest request)
-    {
+    private String getToken(HttpServletRequest request) {
         String token = request.getHeader(header);
-        if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX))
-        {
+        if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) {
             token = token.replace(Constants.TOKEN_PREFIX, "");
         }
         return token;
     }
 
-    private String getTokenKey(String uuid)
-    {
+    private String getTokenKey(String uuid) {
         return CacheConstants.LOGIN_TOKEN_KEY + uuid;
     }
 }

--
Gitblit v1.9.3