205 lines
6.2 KiB
Markdown
205 lines
6.2 KiB
Markdown
|
|
# 系统有效时间功能检查报告
|
|||
|
|
|
|||
|
|
## ✅ 移植完成状态
|
|||
|
|
|
|||
|
|
**移植状态:** ✅ **已完成**
|
|||
|
|
|
|||
|
|
经过对比检查,功能已完整移植,代码与借鉴项目(xinli)完全一致。
|
|||
|
|
|
|||
|
|
## 📋 当前限制逻辑详解
|
|||
|
|
|
|||
|
|
### 1. 执行流程
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
用户登录请求
|
|||
|
|
↓
|
|||
|
|
验证码校验 (validateCaptcha)
|
|||
|
|
↓
|
|||
|
|
登录前置校验 (loginPreCheck)
|
|||
|
|
↓
|
|||
|
|
【系统有效时间检查】← 在这里执行
|
|||
|
|
↓
|
|||
|
|
用户名/密码格式校验
|
|||
|
|
↓
|
|||
|
|
IP黑名单校验
|
|||
|
|
↓
|
|||
|
|
用户身份验证
|
|||
|
|
↓
|
|||
|
|
生成Token,登录成功
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 系统有效时间检查逻辑(validateSystemExpireTime)
|
|||
|
|
|
|||
|
|
#### 2.1 检查时机
|
|||
|
|
- **位置:** `loginPreCheck` 方法的第一行(第145行)
|
|||
|
|
- **时机:** 在验证码校验之后,用户名密码格式校验之前
|
|||
|
|
- **调用方式:** `validateSystemExpireTime(username, null)`
|
|||
|
|
|
|||
|
|
#### 2.2 系统管理员豁免逻辑
|
|||
|
|
|
|||
|
|
**第一步:判断是否为系统管理员**
|
|||
|
|
|
|||
|
|
1. **如果提供了用户ID(userId != null)**
|
|||
|
|
```java
|
|||
|
|
if (SecurityUtils.isAdmin(userId)) {
|
|||
|
|
return; // 系统管理员直接返回,跳过所有检查
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **如果只提供了用户名(userId == null)**
|
|||
|
|
```java
|
|||
|
|
// 通过用户名查找用户
|
|||
|
|
SysUser user = userService.selectUserByUserName(username);
|
|||
|
|
if (user != null && user.isAdmin()) {
|
|||
|
|
return; // 系统管理员直接返回,跳过所有检查
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**系统管理员判断标准:**
|
|||
|
|
- 用户ID = 1
|
|||
|
|
- 或用户对象的 `isAdmin()` 方法返回 `true`
|
|||
|
|
|
|||
|
|
#### 2.3 配置检查逻辑
|
|||
|
|
|
|||
|
|
**第二步:获取配置值**
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
String expireTimeStr = configService.selectConfigByKey("system.top");
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**配置检查规则:**
|
|||
|
|
- 如果配置值为空或不存在 → **不限制,允许登录**
|
|||
|
|
- 如果配置值存在 → 继续检查时间
|
|||
|
|
|
|||
|
|
#### 2.4 时间比较逻辑
|
|||
|
|
|
|||
|
|
**第三步:解析和比较时间**
|
|||
|
|
|
|||
|
|
1. **解析日期时间**
|
|||
|
|
- 支持格式1:`yyyy-MM-dd`(如:`2024-12-31`)
|
|||
|
|
- 支持格式2:`yyyy-MM-dd HH:mm:ss`(如:`2024-12-31 23:59:59`)
|
|||
|
|
|
|||
|
|
2. **日期格式特殊处理**
|
|||
|
|
```java
|
|||
|
|
if (expireTimeStr.trim().length() == 10) {
|
|||
|
|
// 日期格式,转换为当天的 23:59:59.999
|
|||
|
|
// 例如:2024-12-31 → 2024-12-31 23:59:59.999
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
**目的:** 确保配置的日期当天仍然可以登录
|
|||
|
|
|
|||
|
|
3. **时间比较**
|
|||
|
|
```java
|
|||
|
|
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 = ""` 或不存在
|
|||
|
|
- **结果:** ✅ 所有用户可以正常登录(不限制)
|
|||
|
|
|
|||
|
|
## ✅ 移植完整性检查清单
|
|||
|
|
|
|||
|
|
- [x] ✅ 导入语句完整(Date, Logger, SysUser)
|
|||
|
|
- [x] ✅ Logger 字段已添加
|
|||
|
|
- [x] ✅ `validateSystemExpireTime` 方法完整移植
|
|||
|
|
- [x] ✅ 在 `loginPreCheck` 中正确调用
|
|||
|
|
- [x] ✅ 系统管理员豁免逻辑完整
|
|||
|
|
- [x] ✅ 日期格式处理逻辑完整
|
|||
|
|
- [x] ✅ 异常处理逻辑完整
|
|||
|
|
- [x] ✅ 日志记录完整
|
|||
|
|
- [x] ✅ SQL 初始化脚本已创建
|
|||
|
|
- [x] ✅ 移植说明文档已创建
|
|||
|
|
|
|||
|
|
## 📝 结论
|
|||
|
|
|
|||
|
|
**移植状态:** ✅ **100% 完成**
|
|||
|
|
|
|||
|
|
功能已完整移植,代码逻辑与借鉴项目完全一致。限制逻辑清晰明确:
|
|||
|
|
- 系统管理员完全豁免
|
|||
|
|
- 普通用户受系统有效时间限制
|
|||
|
|
- 配置为空时不限制
|
|||
|
|
- 支持灵活的日期格式
|
|||
|
|
- 具备完善的容错处理
|
|||
|
|
|
|||
|
|
功能可以直接使用,建议执行数据库初始化脚本后配置系统有效时间进行测试。
|
|||
|
|
|