Files
user-system/.workbuddy/memory/MEMORY.md
long-agent a3e090e821 test: add service layer unit tests for webhook/metadata/error/config
- webhook_service_test.go: isPrivateIP, isSafeURL, computeHMAC
- request_metadata_test.go: context functions
- classified_error_test.go: error types
- config_defaults_test.go: password reset/SMS defaults
- email_config_test.go: email code defaults
- auth_runtime_test.go: isUserNotFoundError

Service coverage: 11.2% -> 14.7%
2026-04-09 15:30:26 +08:00

151 lines
8.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 项目长期记忆
## 项目概况
- **项目类型**用户管理系统UMS
- **后端**Go + `internal/` 目录
- **前端**`frontend/admin/`React 18 + TypeScript + Vite + Ant Design 5
## 前端技术栈
- 框架React 18 + TypeScript严格模式
- 路由React Router 6createBrowserRouter
- UIAnt Design 5
- 请求:浏览器原生 fetch自建 `lib/http/client.ts`
- 状态React Context仅会话不引入 Redux/Zustand
- 构建Vite配置文件为 vite.config.js非 .ts
## 关键架构决策
- AuthProvider 必须在 RootLayout.tsx 中包裹(在 Router 内部),否则 useNavigate/useLocation 报错
- access_token 保存在内存auth-session.tsrefresh_token 持久化到 localStorage
- 401 处理:单次刷新机制 + 并发刷新锁refreshPromise
- 路由守卫RequireAuthsrc/components/guards/+ RequireAdmin
## 前后端联调评审机制2026-04-01 建立)
- **评审流程**: `docs/processes/FRONTEND_BACKEND_REVIEW.md`
- **检查清单**: `docs/checklists/FRONTEND_BACKEND_CHECKLIST.md`
- **问题分级**: P04h修复、P1当天、P2本周、P3下Sprint
- **通过标准**: 所有 P0/P1 已解决,测试通过率 ≥ 95%
## 前端状态(截至 2026-04-02
- ✅ 全部 13 个页面已实现构建通过5/5 单元测试通过
- ❌ 未实现:批量操作、系统设置页、全局设备管理页、管理员管理页、登录日志导出
- ⚠️ 半接线:设备信任链路(密码登录传 device_id但前端为随机值邮箱/SMS登录不带设备信息
## PRD 缺口状态(截至 2026-04-02 Sprint 14 后)
- GAP-01角色继承✅ 已确认完整实现(循环检测+深度限制+middleware权限汇总
- GAP-02SMS密码重置✅ 已完整修复(时序泄漏 + 密码历史 + doResetPassword
- GAP-03设备信任✅ 全链路闭环(密码/SMS/邮件验证码登录均接 device_id + localStorage持久化
- GAP-04CAS/SAML SSO❌ PRD 标注"可选",推迟 v2.0
- GAP-05异常检测✅ AnomalyDetector 已在 main.go 接线
- GAP-07SDK❌ 推迟 v2.0
- 密码历史记录:✅ ChangePassword + doResetPassword 均已接线
## 代码审查状态最新2026-04-08 生产级评估 v3.0
- **综合评分**:⚠️ 5.9/10 **不合格**
- 🔴 P0 阻塞问题7 个(必须立即修复)
- 🟠 P1 严重问题5 个(本周修复)
- 🟡 P2 高优先级4 个(本月修复)
### 关键差距v2.0 → v3.0 真实评估)
| 维度 | v2.0 | v3.0 | 差距原因 |
|------|------|------|----------|
| 代码质量 | 9.7 | **7.5** | 后端覆盖率仅32.1% |
| 安全强度 | 9.7 | **6.0** | 无gosec、占位JWT密钥 |
| 部署简单性 | 8.0 | **5.0** | Docker无健康检查、无资源限制 |
| 运维可靠性 | 7.0 | **4.0** | 无备份自动化、无灾备方案 |
| 文档规范性 | 7.0 | **5.0** | Runbook缺失、无OpenAPI |
### Sprint 192026-04-08生产级差距分析
- 制定生产级审查标准:`docs/code-review/CODE_REVIEW_STANDARD_V3.md`
- 5维评估体系代码质量25%+安全30%+部署15%+运维20%+文档10%
- P0-P4分级体系
- 生产合并门禁清单
- 差距分析报告:`docs/code-review/PRODUCTION_GAP_ANALYSIS_2026-04-08.md`
- 7个P0问题清单
- 三阶段修复路线图
### 历史修复验证
- Sprint 15 修复清单:
- BUG-01: Goroutine 中使用已回收的 gin context ✅ 已验证
- BUG-02: 密码历史 goroutine 使用裸 context.Background() ✅ 已验证
- BUG-03: 登录日志 goroutine 使用裸 context.Background() ✅ 已验证
- BUG-04: handleError 所有错误一律返回 500 ✅ 已验证
- BUG-05: Logout 不使 Token 失效 ✅ 已验证
- BUG-06: GetCSRFToken 返回 not_implemented ✅ 已验证
- Sprint 16 修复清单:
- SEC-04: JTI 时间戳防枚举格式timestamp + random✅ 已验证
- SEC-08: Refresh Token 滚动轮换防无限流 ✅ 已验证
## 关键 API 路由
- 登录: `POST /api/v1/auth/login`(参数: account/username/email/phone, password, device_id, device_name, device_browser, device_os
- CSRF: `GET /api/v1/auth/csrf-token`
- 用户信息: `GET /api/v1/auth/userinfo`
- 管理员管理: `/api/v1/admin/admins`
- 用户管理: `/api/v1/users`,角色: `/api/v1/roles`,权限: `/api/v1/permissions`
- 登录日志: `/api/v1/logs/login`
## 默认管理员
- username: `admin`password: `Admin@123456`config.yaml 中配置)
- 注意:数据库密码哈希需要通过 `go run reset_admin_pwd.go` 重置后才能匹配
## Sprint 执行记录
- Sprint 122026-04-01建立前后端联调评审机制 + 修复 ValidateRecoveryCode 时序泄漏
- Sprint 132026-04-02GAP-02 SMS重置时序泄漏 + 密码历史 doResetPassword + GAP-03 设备信任链路主路径补齐
- Sprint 142026-04-02 续彻底收口所有遗留问题邮件验证码登录stub/ActivateEmail stub/device_id稳定化/R6-01/R6-02死代码
- Sprint 152026-04-03完整代码审查修复 6 个严重 BUGgoroutine context、错误处理、token 管理)
- Sprint 162026-04-03彻底解决所有遗留问题P1 + SEC-04/06/08E2E 测试 100% 通过
- Sprint 172026-04-05SRE 全面审查 + 执行优化
- 第一轮:识别 5 个 CRIT 问题(评分 4.5/10产出 SRE_SOLUTION.md
- 第二轮:修复 CRIT-01/02/03/04全量测试 34 包 100% 通过,评分升至 7.2/10
- 第三轮:修复 WARN-01/02/03评分升至 **8.0/10**(最终)
- 新建文件:`internal/monitoring/collector.go`(系统指标采集)、`internal/api/middleware/trace_id.go`追踪ID`.env.example`
- 报告:`docs/sre/SRE_REVIEW_ROUND3.md`(三轮完整记录)
- Sprint 182026-04-07Cursor 游标分页全栈优化(完整实施+验证通过)
- 新建 `internal/pagination/cursor.go`(游标编解码工具包)
- Repository 层 4 个 ListCursor 方法LoginLog/OperationLog/Device/Userkeyset 模式 O(limit)
- Service 层 4 个 Cursor 方法 + CursorResult 统一响应结构
- Handler 层双路路由cursor/size → 游标路径page/page_size → offset 回退兼容)
- 前端 DevicesPage cursor 分页集成CursorPaginatedData 类型 + 状态管理 + Table 兼容)
- 规模测试LL P99=53ms, OPLOG P99=55msSLA<100ms比 offset 快 2.3x
- 编译go build ✅, tsc --noEmit ✅
## 下一步候选(低优先级)
- ❌ 已完成SEC-04/06/08 所有安全问题已修复
- 性能优化:数据库查询优化、缓存策略优化
- 功能增强:批量操作、系统设置页、全局设备管理页、管理员管理页、登录日志导出
- 安全加固OAuth 2.0 第三方登录集成、SAML SSO 集成
## 执行计划文档
- 系统性实施计划:`docs/plans/SYSTEMATIC_IMPLEMENTATION_PLAN.md`
- 前端执行方案(唯一有效):`docs/plans/ADMIN_FRONTEND_EXECUTION_PLAN.md`
- 前后端联调实施指南:`docs/processes/FRONTEND_BACKEND_REVIEW_IMPLEMENTATION_GUIDE.md`
## 安全实践亮点(已验证)
- ✅ Argon2id 密码哈希64MB内存、5次迭代、4并行
- ✅ crypto/rand 生成 Token 和盐(无 math/rand
- ✅ JTI 格式timestamp(8字节hex) + random(16字节hex)
- ✅ Token 滚动轮换防无限流
- ✅ 内存存储 access_token非 localStorage
- ✅ HttpOnly Cookie 存储 refresh_token
- ✅ 30秒请求超时控制
- ✅ CSRF 保护机制
- ✅ 登录异常检测AnomalyDetector
- ✅ 常数时间密码比较(防时序攻击)
## 代码审查标准v2.0
- 标准文档:`docs/code-review/CODE_REVIEW_STANDARD_V2.md`
- 流程文档:`docs/code-review/CODE_REVIEW_PROCESS.md`
- 报告目录:`docs/code-review/`
- 合并门禁go vet ✅ / go build ✅ / go test ✅ / lint ✅
- 时效要求常规PR首次审查 4h紧急 1h
## 技术经验积累
- replace_in_file 操作要确保不会重复插入内容
- Ant Design Menu 受控/非受控模式切换受控模式openKeys与CSS冲突改用 defaultOpenKeys
- 前端 CSS`:root` 不是 `::root``::-webkit-scrollbar` 不是 `:::-webkit-scrollbar`
- 后端循环依赖排查:先用 `go build` 查是否能通过,再查循环导入链
- go test 在 Windows PowerShell 不能用 `| tail`,改用 `| Select-Object -Last N`