docs(status): record identity scope convergence and the PathPattern ** trap
This commit is contained in:
@@ -713,6 +713,17 @@ Invariant测试:10个(INV-011~020)→ **实测:原 14 个用例无任何
|
|||||||
遗留(第三方开放,属范围扩张,需产品决策):第三方凭据机制、限流是否真实生效、
|
遗留(第三方开放,属范围扩张,需产品决策):第三方凭据机制、限流是否真实生效、
|
||||||
OpenAPI 对外发布、调用审计与配额、分页幂等覆盖、脱敏边界。
|
OpenAPI 对外发布、调用审计与配额、分页幂等覆盖、脱敏边界。
|
||||||
|
|
||||||
|
**同日续做:身份类型与路径规则收敛**
|
||||||
|
|
||||||
|
| 发现 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| 运营身份可打进用户端 | 兜底规则是 `authenticated()`,运营 token 完全满足;而 `@AuthenticationPrincipal UserPrincipal` 遇 `OperatorPrincipal` 类型不匹配返回 **null**(Spring 默认 `errorOnInvalidType=false`),全仓 **244 处**使用、**仅 48 处**做 null 检查 → 其余 **NPE → 500** |
|
||||||
|
| PathPattern 陷阱 | 嵌套运营端点(`/counseling/services/operator/**` 等)不能用 `/**/operator/**` 覆盖——`**` 只允许在末尾,写了会抛 `PatternParseException` 且**整个过滤器链 500**(实测 E2E 由 37 passed 直落 33 failed) |
|
||||||
|
| 修法 | 兜底收紧为 `hasRole("USER")`(196 处潜在 NPE 在认证层消解,不补 null 检查)+ 显式枚举 9 个运营前缀 + 新增 `SecurityPathCoverageTest` 机械守卫(防将来新增端点漏配) |
|
||||||
|
|
||||||
|
验证:E2E **40 passed**(+3 身份隔离用例);后端回归 **664 / 0 / 0 / 3**。
|
||||||
|
守卫经负向验证(摘掉 `/content/operator/**` → 恰好 1 用例变红并列出受影响的 6 个端点)。
|
||||||
|
|
||||||
详见 `docs/HTTP语义检修报告-2026-09-18.md`。
|
详见 `docs/HTTP语义检修报告-2026-09-18.md`。
|
||||||
|
|
||||||
### Phase 24 — UAT增量 ✅ 已就绪(测试数据支持)
|
### Phase 24 — UAT增量 ✅ 已就绪(测试数据支持)
|
||||||
|
|||||||
Reference in New Issue
Block a user