6.2 KiB
6.2 KiB
系统有效时间功能检查报告
✅ 移植完成状态
移植状态: ✅ 已完成
经过对比检查,功能已完整移植,代码与借鉴项目(xinli)完全一致。
📋 当前限制逻辑详解
1. 执行流程
用户登录请求
↓
验证码校验 (validateCaptcha)
↓
登录前置校验 (loginPreCheck)
↓
【系统有效时间检查】← 在这里执行
↓
用户名/密码格式校验
↓
IP黑名单校验
↓
用户身份验证
↓
生成Token,登录成功
2. 系统有效时间检查逻辑(validateSystemExpireTime)
2.1 检查时机
- 位置:
loginPreCheck方法的第一行(第145行) - 时机: 在验证码校验之后,用户名密码格式校验之前
- 调用方式:
validateSystemExpireTime(username, null)
2.2 系统管理员豁免逻辑
第一步:判断是否为系统管理员
-
如果提供了用户ID(userId != null)
if (SecurityUtils.isAdmin(userId)) { return; // 系统管理员直接返回,跳过所有检查 } -
如果只提供了用户名(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:
yyyy-MM-dd(如:2024-12-31) - 支持格式2:
yyyy-MM-dd HH:mm:ss(如:2024-12-31 23:59:59)
- 支持格式1:
-
日期格式特殊处理
if (expireTimeStr.trim().length() == 10) { // 日期格式,转换为当天的 23:59:59.999 // 例如:2024-12-31 → 2024-12-31 23:59:59.999 }目的: 确保配置的日期当天仍然可以登录
-
时间比较
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% 完成
功能已完整移植,代码逻辑与借鉴项目完全一致。限制逻辑清晰明确:
- 系统管理员完全豁免
- 普通用户受系统有效时间限制
- 配置为空时不限制
- 支持灵活的日期格式
- 具备完善的容错处理
功能可以直接使用,建议执行数据库初始化脚本后配置系统有效时间进行测试。