Browse Source

在线用户强退功能报错修复,添加用户存在token统计,用户id获取

ZJY 5 months ago
parent
commit
8ec780512f

+ 26 - 8
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysUserOnlineController.java

@@ -1,9 +1,9 @@
 package com.usky.system.controller.web;
 
 import java.util.*;
-
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.constants.CacheConstants;
+import com.usky.common.core.utils.StringUtils;
 import com.usky.common.log.annotation.Log;
 import com.usky.common.log.enums.BusinessType;
 import com.usky.common.redis.core.RedisService;
@@ -52,7 +52,6 @@ public class SysUserOnlineController {
                 return ApiResult.error("SYS-0000", "Redis keys is null or empty");
             }
             Map<String, List<SysUserOnline>> userOnlineMap = new HashMap<>();
-            long currentTime = System.currentTimeMillis();
 
             for (String key : keys) {
                 // 检查键是否存在并且未过期
@@ -61,7 +60,8 @@ public class SysUserOnlineController {
                     if (user != null) {
                         SysUserOnline online = userOnlineService.loginUserToUserOnline(user);
                         if (online != null) {
-                            userOnlineMap.computeIfAbsent(user.getUsername(), k -> new ArrayList<>()).add(online);
+                            List<SysUserOnline> list = userOnlineMap.computeIfAbsent(user.getUsername(), k -> new ArrayList<>());
+                            list.add(online);
                         }
                     }
                 }
@@ -71,7 +71,9 @@ public class SysUserOnlineController {
             for (Map.Entry<String, List<SysUserOnline>> entry : userOnlineMap.entrySet()) {
                 List<SysUserOnline> sortedList = entry.getValue();
                 sortedList.sort(Comparator.comparing(SysUserOnline::getLoginTime).reversed());
+                int loginCount = sortedList.size(); // 计算登录次数
                 SysUserOnline lastOnline = sortedList.get(0); // 取最后登录时间的记录
+                lastOnline.setLoginCount(loginCount); // 设置登录记录的数量
                 lastOnline.setPreviousOnlines(sortedList.subList(1, sortedList.size())); // 设置其他登录记录
                 userOnlineList.add(lastOnline);
             }
@@ -94,12 +96,28 @@ public class SysUserOnlineController {
     /**
      * 强退用户
      */
-    @RequiresPermissions("monitor:online:forceLogout")
+//    @RequiresPermissions("monitor:online:forceLogout")
     @Log(title = "在线用户", businessType = BusinessType.FORCE)
     @DeleteMapping("/{tokenId}")
-    public ApiResult forceLogout(@PathVariable String tokenId)
-    {
-        redisService.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId);
-        return ApiResult.success();
+    public ApiResult forceLogout(@PathVariable String tokenId) {
+        try {
+            if (StringUtils.isBlank(tokenId)) {
+                logger.error("Token ID is blank for force logout");
+                return ApiResult.error("SYS-0004", "Token ID is required for force logout");
+            }
+
+            String key = CacheConstants.LOGIN_TOKEN_KEY + tokenId;
+            boolean deleted = redisService.deleteObject(key);
+            if (deleted) {
+                logger.info("User with tokenId {} has been forcibly logged out.", tokenId);
+                return ApiResult.success();
+            } else {
+                logger.warn("Failed to find and delete user session with tokenId {}", tokenId);
+                return ApiResult.error("SYS-0002", "Session not found or already deleted");
+            }
+        } catch (Exception ex) {
+            logger.error("Error processing forceLogout for tokenId {}", tokenId, ex);
+            return ApiResult.error("SYS-0003", "Internal system error during force logout", ex.getMessage());
+        }
     }
 }

+ 22 - 1
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/SysUserOnline.java

@@ -1,7 +1,6 @@
 package com.usky.system.domain;
 
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 
 /**
@@ -13,6 +12,9 @@ public class SysUserOnline {
     /** 会话编号 */
     private String tokenId;
 
+    /** 用户ID */
+    private Long userid;
+
     /** 部门名称 */
     private String deptName;
 
@@ -37,6 +39,9 @@ public class SysUserOnline {
     /** 最后访问时间 */
     private Long expireTime;
 
+    /** 登录记录的数量 */
+    private int loginCount;
+
 
     private SysUserOnline lastOnline;
     private List<SysUserOnline> previousOnlines;
@@ -55,6 +60,14 @@ public class SysUserOnline {
         this.tokenId = tokenId;
     }
 
+    public Long getUserid() {
+        return userid;
+    }
+
+    public void setUserid(Long userid) {
+        this.userid = userid;
+    }
+
     public String getDeptName() {
         return deptName;
     }
@@ -138,4 +151,12 @@ public class SysUserOnline {
     public void setPreviousOnlines(List<SysUserOnline> previousOnlines) {
         this.previousOnlines = previousOnlines;
     }
+
+    public int getLoginCount() {
+        return loginCount;
+    }
+
+    public void setLoginCount(int loginCount) {
+        this.loginCount = loginCount;
+    }
 }

+ 1 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysUserOnlineServiceImpl.java

@@ -85,6 +85,7 @@ public class SysUserOnlineServiceImpl implements ISysUserOnlineService
         }
         SysUserOnline sysUserOnline = new SysUserOnline();
         sysUserOnline.setTokenId(user.getToken());
+        sysUserOnline.setUserid(user.getUserid());
         sysUserOnline.setUserName(user.getUsername());
         sysUserOnline.setIpaddr(user.getIpaddr());
         sysUserOnline.setLoginTime(user.getLoginTime());

+ 6 - 6
usky-common/usky-common-security/src/main/java/com/usky/common/security/auth/AuthLogic.java

@@ -118,17 +118,17 @@ public class AuthLogic
         }
         return permissions.stream().anyMatch(p -> p.equals(permission));
     }
+    @ExceptionHandler(NotPermissionException.class)
+    public ApiResult<Void> handleNotPermissionException(NotPermissionException ex) {
+        return ApiResult.error("您没有权限执行这个操作");
+    }
 
     /**
      * 验证用户是否具备某权限, 如果验证未通过,则抛出异常: NotPermissionException
-     * 
-//     * @param permission 权限字符串
+     *
+     * @param permission 权限字符串
      * @return 用户是否具备某权限
      */
-    @ExceptionHandler(NotPermissionException.class)
-    public ApiResult<Void> handleNotPermissionException(NotPermissionException ex) {
-        return ApiResult.error("您没有权限执行这个操作");
-    }
     public void checkPermi(String permission)
     {
         if (!hasPermi(getPermiList(), permission))