跳转至

文档管理与代码修正总结

问题发现

你指出了一个严重的问题: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 次被锁定,在公司仍可以登录

文档管理改进

  • ✅ 单一权威文档,避免混淆
  • ✅ 过期文档标注警告,防止误用
  • ✅ 建立更新流程,确保代码与文档同步
  • ✅ 代码注释指向文档,便于维护

长期维护建议

  1. 定期审查 - 每月审查一次登录相关代码
  2. 代码注释 - 在关键代码处添加文档引用
  3. Git 规范 - 提交信息引用权威文档
  4. 代码审查 - PR 审查时检查文档一致性

下一步工作

立即需要做

  • 测试登录功能(验证 Phone + IP 计数是否正确)
  • 验证跨 IP 场景(同一账户不同 IP 的独立计数)

需要实现的功能

  • 短信验证码重发检查(旧验证码未失效时不允许重发)
  • 短信验证码失败次数计数(基于 Phone + IP)
  • 短信发送锁定机制(失败 5 次后锁定 15 分钟)

文档完善

  • memory/login_design_final.md 中添加版本历史
  • 更新测试清单,标注已完成的测试
  • 添加故障排查指南

总结

问题 解决方案 状态
多个文档冲突 指定单一权威文档 ✅ 完成
不知道哪个最新 版本号 + 修改日期 ✅ 完成
容易遗漏更新 更新流程 + 检查清单 ✅ 完成
代码与文档不同步 代码注释 + Git 规范 ✅ 完成
维护成本高 定期审查 + 代码审查 ✅ 完成

关键原则: - ✅ 一个权威文档 - ✅ 代码必须与文档一致 - ✅ 每次变更同时更新文档和代码 - ✅ 过期文档标注警告 - ✅ 建立长期维护流程