guoyu/_已清理文件备份_周六 22512/md/系统有效时间功能检查报告.md
2025-12-06 20:11:36 +08:00

6.2 KiB
Raw Blame History

系统有效时间功能检查报告

移植完成状态

移植状态: 已完成

经过对比检查功能已完整移植代码与借鉴项目xinli完全一致。

📋 当前限制逻辑详解

1. 执行流程

用户登录请求
    ↓
验证码校验 (validateCaptcha)
    ↓
登录前置校验 (loginPreCheck)
    ↓
【系统有效时间检查】← 在这里执行
    ↓
用户名/密码格式校验
    ↓
IP黑名单校验
    ↓
用户身份验证
    ↓
生成Token登录成功

2. 系统有效时间检查逻辑validateSystemExpireTime

2.1 检查时机

  • 位置: loginPreCheck 方法的第一行第145行
  • 时机: 在验证码校验之后,用户名密码格式校验之前
  • 调用方式: validateSystemExpireTime(username, null)

2.2 系统管理员豁免逻辑

第一步:判断是否为系统管理员

  1. 如果提供了用户IDuserId != null

    if (SecurityUtils.isAdmin(userId)) {
        return; // 系统管理员直接返回,跳过所有检查
    }
    
  2. 如果只提供了用户名userId == null

    // 通过用户名查找用户
    SysUser user = userService.selectUserByUserName(username);
    if (user != null && user.isAdmin()) {
        return; // 系统管理员直接返回,跳过所有检查
    }
    

系统管理员判断标准:

  • 用户ID = 1
  • 或用户对象的 isAdmin() 方法返回 true

2.3 配置检查逻辑

第二步:获取配置值

String expireTimeStr = configService.selectConfigByKey("system.top");

配置检查规则:

  • 如果配置值为空或不存在 → 不限制,允许登录
  • 如果配置值存在 → 继续检查时间

2.4 时间比较逻辑

第三步:解析和比较时间

  1. 解析日期时间

    • 支持格式1yyyy-MM-dd(如:2024-12-31
    • 支持格式2yyyy-MM-dd HH:mm:ss(如:2024-12-31 23:59:59
  2. 日期格式特殊处理

    if (expireTimeStr.trim().length() == 10) {
        // 日期格式,转换为当天的 23:59:59.999
        // 例如2024-12-31 → 2024-12-31 23:59:59.999
    }
    

    目的: 确保配置的日期当天仍然可以登录

  3. 时间比较

    if (now.after(expireTime)) {
        // 当前时间 > 过期时间 → 系统已过期
        throw new ServiceException("系统出现问题,请联系管理员");
    }
    

2.5 异常处理逻辑

日期解析失败:

  • 记录警告日志:log.warn("系统有效时间配置解析失败: {}", expireTimeStr, e)
  • 不阻止登录(容错处理)

用户查找失败:

  • 记录调试日志:log.debug("查找用户失败,继续检查系统有效时间: {}", username, e)
  • 继续执行系统有效时间检查

系统过期:

  • 记录登录失败日志:"系统有效时间已过期"
  • 抛出异常:ServiceException("系统出现问题,请联系管理员")
  • 阻止登录

🔍 限制逻辑总结

限制条件

条件 结果
系统管理员用户ID=1 不受限制,始终可以登录
配置值为空或不存在 不限制,允许登录
配置值存在且当前时间 ≤ 过期时间 允许登录
配置值存在且当前时间 > 过期时间 阻止登录,提示"系统出现问题,请联系管理员"

限制范围

  • 仅限制普通用户登录
  • 系统管理员完全豁免
  • 配置为空时不限制

限制时机

  • 在登录流程的最前端执行(验证码校验之后)
  • 在用户名密码格式校验之前
  • 在用户身份验证之前

📊 代码对比验证

借鉴项目xinli

  • 文件:ry-xinli-framework/src/main/java/com/ddnai/framework/web/service/SysLoginService.java
  • 方法:validateSystemExpireTime第183-258行
  • 调用:loginPreCheck 方法第145行

当前项目Study-Vue-redis

  • 文件:ry-study-framework/src/main/java/com/ddnai/framework/web/service/SysLoginService.java
  • 方法:validateSystemExpireTime第183-258行
  • 调用:loginPreCheck 方法第145行

对比结果: 代码完全一致,移植完整

🎯 实际应用场景

场景1系统未过期

  • 配置: system.top = "2024-12-31"
  • 当前时间: 2024-10-15
  • 结果: 所有用户(包括普通用户)可以正常登录

场景2系统已过期普通用户

  • 配置: system.top = "2024-10-01"
  • 当前时间: 2024-10-15
  • 普通用户登录: 被阻止,提示"系统出现问题,请联系管理员"
  • 系统管理员登录: 可以正常登录

场景3系统已过期日期格式

  • 配置: system.top = "2024-10-15"
  • 当前时间: 2024-10-15 23:59:00
  • 结果: 可以登录(因为转换为 23:59:59.999,当天仍有效)

场景4系统已过期日期时间格式

  • 配置: system.top = "2024-10-15 12:00:00"
  • 当前时间: 2024-10-15 12:00:01
  • 普通用户登录: 被阻止
  • 系统管理员登录: 可以正常登录

场景5配置为空

  • 配置: system.top = "" 或不存在
  • 结果: 所有用户可以正常登录(不限制)

移植完整性检查清单

  • 导入语句完整Date, Logger, SysUser
  • Logger 字段已添加
  • validateSystemExpireTime 方法完整移植
  • loginPreCheck 中正确调用
  • 系统管理员豁免逻辑完整
  • 日期格式处理逻辑完整
  • 异常处理逻辑完整
  • 日志记录完整
  • SQL 初始化脚本已创建
  • 移植说明文档已创建

📝 结论

移植状态: 100% 完成

功能已完整移植,代码逻辑与借鉴项目完全一致。限制逻辑清晰明确:

  • 系统管理员完全豁免
  • 普通用户受系统有效时间限制
  • 配置为空时不限制
  • 支持灵活的日期格式
  • 具备完善的容错处理

功能可以直接使用,建议执行数据库初始化脚本后配置系统有效时间进行测试。