Commit 5cf19a9214dcae440f2f16f2591d43f44bcb52a8
1 parent
810f6969
docs(usr): review approved + check off REQ-USR-004
Showing
2 changed files
with
38 additions
and
1 deletions
docs/08-模块任务管理.md
docs/superpowers/reviews/2026-04-30-REQ-USR-004.md
0 → 100644
| 1 | +--- | ||
| 2 | +req_id: REQ-USR-004 | ||
| 3 | +date: 2026-04-30 | ||
| 4 | +round: 1 | ||
| 5 | +reviewer: superpower-code-reviewer | ||
| 6 | +--- | ||
| 7 | + | ||
| 8 | +# Review: REQ-USR-004 — round 1 | ||
| 9 | + | ||
| 10 | +## 结论 | ||
| 11 | +approve | ||
| 12 | + | ||
| 13 | +## Must-fix | ||
| 14 | +(无) | ||
| 15 | + | ||
| 16 | +## Nice-to-have | ||
| 17 | + | ||
| 18 | +- backend/src/main/java/com/xly/erp/module/mod/service/impl/ModuleServiceImpl.java:33 + UserServiceImpl.java:72 — 移除 fallback 后 `private final StubSecurityProperties stub` 字段已无引用。按 CLAUDE.md surgical-changes 原则建议删除字段 + 构造器参数(测试 setUp 也需同步)。本期保留亦可,留做后续 housekeeping。 | ||
| 19 | +- backend/src/test/java/com/xly/erp/module/usr/security/LoginAttemptStoreTest.java:44-59 — `lockExpiresAfterDuration` 只验证另一个 fresh user 在 T+20min 未锁,未驱动同 userName 跨过 lockExpireAt 验证 records.remove 自动清除路径。spec line 117 `loginAfterLockExpired_resetsCounter` 要求;建议加测试用 Clock 推进到 T+15min 以上的同 key 路径。 | ||
| 20 | +- ModuleControllerIT / UserControllerIT 的 PUT 无 JWT 闭环回归断言只覆盖单列(sModuleNameZh / sUserName)unchanged;建议同时断 sCreatedBy / tCreateDate 也保持以增强回归覆盖。 | ||
| 21 | +- backend/src/main/java/com/xly/erp/module/usr/dto/LoginDTO.java:17 — `version` 字段标 `@NotBlank`,但 spec § 输入 写"version 仅记录, 不参与校验"。建议二选一:去 @NotBlank 或更新 spec 标注必填。 | ||
| 22 | +- backend/src/test/java/com/xly/erp/module/usr/controller/AuthControllerIT.java `loginWithEmptyBody_returns40001` 发空对象同时触发 3 个 @NotBlank;建议细粒度补一个仅缺 sUserName 的负例,验证 GlobalExceptionHandler 的字段定位文案。 | ||
| 23 | +- AuthControllerIT.loginAfter5WrongPasswords (line 127) 的 `loginAttemptStore.clearFailures("锁定用户")` 在测试体末尾才执行;assertion 失败时跳过会污染跨测试状态。建议挪到 @AfterEach 或用唯一 userName。 | ||
| 24 | + | ||
| 25 | +## 反例 / 测试覆盖缺口 | ||
| 26 | + | ||
| 27 | +Phase A: 5 controller IT + 9 service 单测 + 5 store 单测 + 2 mapper IT 全部到位。 | ||
| 28 | +Phase B: 4 ModuleControllerIT + 3 UserControllerIT stub 闭环全部更新。 | ||
| 29 | +- SecurityConfig 收紧到仅 `POST /api/usr/auth/login` permitAll,其余 authenticated;JwtAuthenticationEntryPoint 把未认证转 `code=20001`。 | ||
| 30 | +- service 层 `stub.getStubUserNo()` 引用和 `// REQ-MOD-001 stub: see USR-004 follow-up` 锚点全部从代码中清除(grep 0 结果)。 | ||
| 31 | +- JWT 双 token:accessToken 8h / refreshToken 30d,二者 subject 相同但内容不同。 | ||
| 32 | +- 锁定路径:密码正确但锁定中仍返回 42301(spec § 业务规则 #4 ✓)。 | ||
| 33 | +- 信息泄漏防护:用户不存在 / 密码错均返回 40101(不区分)。 | ||
| 34 | +- LoginVO 排除 sPasswordHash,AuthControllerIT 显式断言 `data.user.has("sPasswordHash")` 为 false。 | ||
| 35 | +- 149/149 全绿(mvn test via scripts/test.sh)。 | ||
| 36 | + | ||
| 37 | +非阻塞缺口:见 nice-to-have 6 项,建议 module-report 阶段一次性批量补齐。 |