Browse Source

pc限制一台登录

liuchengsen 1 tháng trước cách đây
mục cha
commit
de9bfa9ab8

+ 6 - 3
zhijiayun-user/src/main/java/com/xuekairui/user/mapper/OperationAuditLogMapper.java

@@ -39,10 +39,13 @@ public interface OperationAuditLogMapper extends BaseMapper<OperationAuditLog> {
     List<OperationAuditLog> selectSensitiveLogs(@Param("startTime") LocalDateTime startTime);
 
     /**
-     * 统计指定模块的操作次数
+     * 统计指定模块的操作次数(startTime/endTime 为空时不加时间过滤)
      */
-    @Select("SELECT COUNT(*) FROM t_operation_audit_log WHERE module = #{module} " +
-            "AND operation_time >= #{startTime} AND operation_time <= #{endTime}")
+    @Select("<script>" +
+            "SELECT COUNT(*) FROM t_operation_audit_log WHERE module = #{module}" +
+            "<if test='startTime != null'> AND operation_time &gt;= #{startTime}</if>" +
+            "<if test='endTime != null'> AND operation_time &lt;= #{endTime}</if>" +
+            "</script>")
     long countByModuleAndTimeRange(@Param("module") String module,
                                     @Param("startTime") LocalDateTime startTime,
                                     @Param("endTime") LocalDateTime endTime);

+ 18 - 24
zhijiayun-user/src/main/java/com/xuekairui/user/security/JwtAuthenticationFilter.java

@@ -151,9 +151,9 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
      * <p>
      * 普通用户:
      * <ul>
-     *   <li>小程序端(loginSource=MINIAPP):最多 5 台,与 PC 共存</li>
-     *   <li>旧 token(loginSource 为空或 UNKNOWN,修复前签发):范围匹配,向前兼容,给老用户宽限期</li>
-     *   <li>PC 端(loginSource=PC):最多 5 台同时在线</li>
+     *   <li>小程序端(loginSource=MINIAPP):不限制设备数,不踢任何 token,与 PC 共存</li>
+     *   <li>旧 token(loginSource 为空或 UNKNOWN,修复前签发):宽限期容忍 2 个版本差异,平滑过渡</li>
+     *   <li>PC 端(loginSource=PC):精确匹配,严格单设备登录,新登录踢旧设备</li>
      * </ul>
      */
     private boolean isTokenVersionValid(Long id, String loginSource,
@@ -182,30 +182,24 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
             tokenVersionCache.putVersion(id, isAdmin, currentVersion);
         }
 
-//        if (isAdmin) {
-//            return tokenVer <= currentVersion && (currentVersion - tokenVer) < 5;
-//        }
-//
-//        // 小程序端:暂不限制设备数,不踢 token
-//        if ("MINIAPP".equals(loginSource)) {
-//            return tokenVer <= currentVersion && (currentVersion - tokenVer) < 2;
-//        }
-//
-//        // 旧 token(loginSource 为空或 UNKNOWN,即修复前签发的 token):
-//        // 暂不限制设备数,不踢 token
-//        if (loginSource == null || "UNKNOWN".equals(loginSource)) {
-//            return tokenVer <= currentVersion && (currentVersion - tokenVer) < 2;
-//        }
+        // 管理员:范围匹配,最多 5 台设备同时在线
+        if (isAdmin) {
+            return tokenVer <= currentVersion && (currentVersion - tokenVer) < 5;
+        }
+
+        // 小程序端:不限制设备数,不踢任何 token,确保与 PC 端共存互不影响
+        if ("MINIAPP".equals(loginSource)) {
+            return true;
+        }
 
         // 旧 token(loginSource 为空或 UNKNOWN,即修复前签发的 token):
-        // 走范围匹配,给老用户一个宽限期,避免 tokenVersion 变化后被立即踢出。
-        // 真正的向前兼容:旧 token 容忍 2 个版本差异,平滑过渡到新 token。
-    //    if (loginSource == null || "UNKNOWN".equals(loginSource)) {
-     //       return tokenVer <= currentVersion && (currentVersion - tokenVer) < 2;
-     //   }
+        // 范围匹配,容忍 2 个版本差异,给老用户宽限期平滑过渡到新 token
+        if (loginSource == null || "UNKNOWN".equals(loginSource)) {
+            return tokenVer <= currentVersion && (currentVersion - tokenVer) <= 2;
+        }
 
-        // PC 端(明确 loginSource=PC):精确匹配,严格单设备
-        return true;
+        // PC 端(明确 loginSource=PC):精确匹配,严格单设备,新登录踢旧设备
+        return tokenVer == currentVersion;
     }
 
     /**

+ 3 - 1
zhijiayun-user/src/main/java/com/xuekairui/user/service/OperationAuditLogService.java

@@ -3,6 +3,7 @@ package com.xuekairui.user.service;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
 import com.xuekairui.common.ValidateUtil;
 import com.xuekairui.user.entity.OperationAuditLog;
 import com.xuekairui.user.enums.AuditResult;
@@ -31,7 +32,8 @@ public class OperationAuditLogService {
 
     private final OperationAuditLogMapper auditLogMapper;
     private final com.xuekairui.user.mapper.AdminMapper adminMapper;
-    private final ObjectMapper objectMapper = new ObjectMapper();
+    private final ObjectMapper objectMapper = new ObjectMapper()
+            .registerModule(new JavaTimeModule());
 
     /**
      * 记录操作日志(异步执行,不影响主业务流程)