From ed725daccd38789f1a8cd9bade8d85a5c3b3be81 Mon Sep 17 00:00:00 2001 From: WorkBuddy Date: Fri, 18 Sep 2026 15:06:06 +0800 Subject: [PATCH] docs(status): record identity scope convergence and the PathPattern ** trap --- docs/STATUS.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/STATUS.md b/docs/STATUS.md index dc58ea3..964428b 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -713,6 +713,17 @@ Invariant测试:10个(INV-011~020)→ **实测:原 14 个用例无任何 遗留(第三方开放,属范围扩张,需产品决策):第三方凭据机制、限流是否真实生效、 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`。 ### Phase 24 — UAT增量 ✅ 已就绪(测试数据支持)