文档管理与代码修正总结¶
问题发现¶
你指出了一个严重的问题:13 个登录相关文档存在逻辑冲突,早期文档与现有代码不一致。
具体冲突示例¶
| 项目 | 旧文档 | 新文档 | 代码现状 |
|---|---|---|---|
| 验证码显示时机 | 失败 2 次后 | 失败 1 次后 ✅ | 已修正 |
| 失败次数计数 | 仅手机号 | Phone + IP ✅ | 已修正 |
| 短信重发规则 | 无说明 | 旧验证码未失效时不允许重发 ✅ | 待实现 |
解决方案¶
1️⃣ 建立单一真实来源 (Single Source of Truth)¶
指定 memory/login_design_final.md 为唯一权威文档
- ✅ 最新修改时间(Mar 15 10:49)
- ✅ 最详细的设计说明
- ✅ 包含完整的测试清单
- ✅ 包含关键实现细节
2️⃣ 标注过期文档¶
在以下 4 个文档顶部添加了警告标记:
Markdown
⚠️ **已过期** - 此文档已被 `memory/login_design_final.md` 替代
请参考最新文档获取准确的登录逻辑说明。
文件列表: - ✅ LOGIN_FAILURE_HANDLING_GUIDE.md - ✅ PASSWORD_LOGIN_CAPTCHA_GUIDE.md - ✅ SECURITY_FIXES_PASSWORD_LOGIN.md - ✅ SMS_PROTECTION_GUIDE.md
3️⃣ 更新 CLAUDE.md¶
添加了"登录功能文档"部分,指向权威文档和关键设计。
4️⃣ 创建文档管理方案¶
创建了 memory/DOCUMENTATION_MANAGEMENT.md,包含:
- 文档分类规则
- 更新流程
- 代码审查清单
- 长期维护建议
代码修正¶
修改的文件¶
1. Controllers/AccountController.cs¶
C#
// 添加 IP 参数获取
var ip = GetClientIp();
// 修改验证码显示逻辑:失败 1 次后显示(之前是 2 次)
var needsCaptcha = (model.LoginType == "password" && failedCount >= 1) ||
(model.LoginType == "sms") ||
(string.IsNullOrEmpty(model.LoginType) && failedCount >= 1);
// 修改失败次数计数:基于 Phone + IP(之前仅基于手机号)
var (currentFailedCount, isNowLocked) = _loginAttemptService.RecordFailedAttempt(model.Phone, ip);
2. Services/LoginAttemptService.cs¶
C#
// 所有方法都添加了 IP 参数
public (bool isLocked, int remainingMinutes) IsAccountLocked(string phone, string ip = "")
public (int failedCount, bool isNowLocked) RecordFailedAttempt(string phone, string ip = "")
public void ClearFailedAttempts(string phone, string ip = "")
public int GetFailedAttempts(string phone, string ip = "")
public int GetRemainingAttempts(string phone, string ip = "")
// 修改缓存键生成逻辑
private string GetAttemptKey(string phone, string ip = "") => $"login_attempt_{phone}_{ip}";
private string GetLockKey(string phone, string ip = "") => $"login_lock_{phone}_{ip}";
编译状态¶
✅ 编译通过,无错误无警告
关键改进¶
安全性提升¶
- ✅ 同一账户在不同 IP 上的失败次数独立计算
- ✅ 防止跨 IP 的分布式暴力破解
- ✅ 用户在家失败 5 次被锁定,在公司仍可以登录
文档管理改进¶
- ✅ 单一权威文档,避免混淆
- ✅ 过期文档标注警告,防止误用
- ✅ 建立更新流程,确保代码与文档同步
- ✅ 代码注释指向文档,便于维护
长期维护建议¶
- 定期审查 - 每月审查一次登录相关代码
- 代码注释 - 在关键代码处添加文档引用
- Git 规范 - 提交信息引用权威文档
- 代码审查 - PR 审查时检查文档一致性
下一步工作¶
立即需要做¶
- 测试登录功能(验证 Phone + IP 计数是否正确)
- 验证跨 IP 场景(同一账户不同 IP 的独立计数)
需要实现的功能¶
- 短信验证码重发检查(旧验证码未失效时不允许重发)
- 短信验证码失败次数计数(基于 Phone + IP)
- 短信发送锁定机制(失败 5 次后锁定 15 分钟)
文档完善¶
- 在
memory/login_design_final.md中添加版本历史 - 更新测试清单,标注已完成的测试
- 添加故障排查指南
总结¶
| 问题 | 解决方案 | 状态 |
|---|---|---|
| 多个文档冲突 | 指定单一权威文档 | ✅ 完成 |
| 不知道哪个最新 | 版本号 + 修改日期 | ✅ 完成 |
| 容易遗漏更新 | 更新流程 + 检查清单 | ✅ 完成 |
| 代码与文档不同步 | 代码注释 + Git 规范 | ✅ 完成 |
| 维护成本高 | 定期审查 + 代码审查 | ✅ 完成 |
关键原则: - ✅ 一个权威文档 - ✅ 代码必须与文档一致 - ✅ 每次变更同时更新文档和代码 - ✅ 过期文档标注警告 - ✅ 建立长期维护流程