test(invariants): Phase 23 Task 2.2 —— INV-011 显式行为守卫(9 用例 + 两次负向注入验证)

产出 Inv011EvidenceAccessGuardTest:非领取人 / 跨用户佐证 / 非 local_eligibility 任务一律拒绝,
且 successful 与 denied 两条路径都断言 sensitive_access_logs 真实落库(不用 mock 断言)。
另含 3 个结构性守卫(用户侧端点无用户可控 userId 入参、佐证读取入口的双重权限约束、
佐证读取不暴露可伪造 operatorId)与 1 个守卫自检(参数名反射可读,防断言静默永真)。

前置修复:schema-h2.sql 补 sensitive_access_logs 表 —— 该表此前在测试库完全不存在,
而它是「访问留痕」命题的唯一落点,缺失导致该命题根本无法断言(表漂移盲区,与 Phase 12/15/19 同族)。

负向注入两次,均精确命中:
① 停用 requireClaimOwner → 恰 1 红(非领取人用例),其余 8 绿
② 停用 catch 内 denied 审计 → 恰 2 红(非领取人 + 跨用户),第 3 条走 try 外的另一路径故正确未红
两次注入均已还原并复跑全绿(9/9);V11InvariantsTest 12/12 绿;UI 契约门禁 18/18 绿。

文档:Task 2.2 闭环记录 + 附 A 扩至 7 处校正(含对本文档初稿「机构创建 500 归因」的自我更正,
实测为 chk_org_status 违约而非 id 为空)+ 附 B 扩至 11 项新发现
(5 个 Mapper 方法声明了却无实现、隐私设置三方契约冲突 + 表/实体主键错配、
测试镜像 mvn -o 不可用、本机全量回归会卡住)。
This commit is contained in:
WorkBuddy
2026-09-19 14:02:52 +08:00
parent e666ee6f8a
commit b834fa86a0
4 changed files with 561 additions and 19 deletions
+18
View File
@@ -255,6 +255,24 @@ CREATE TABLE local_eligibility_evidences (
created_at TIMESTAMP WITH TIME ZONE, updated_at TIMESTAMP WITH TIME ZONE, deleted_at TIMESTAMP WITH TIME ZONE
);
-- V001 + V034 + V035: sensitive_access_logs 敏感数据访问审计
-- INV-011 的「可核查」落点正是本表(access_result = success / denied)。
-- 本表此前在测试库**完全不存在**,而 ReviewService.logEvidenceAccess 一定会写它 ——
-- 后果:任何「审计真的落库了吗」的断言都无从编写,INV-011 只能退化成常量断言;
-- 生产上新接入的审计路径在测试期零覆盖。与 Phase 12 复验记录的
-- user_identities / review_tasks 缺失同族(表漂移盲区),此处补齐。
-- 列定义对齐:V001 建表(id/operator_id/user_id/data_type/reason/ip/created_at)
-- + V034(access_target/access_result)
-- + V035(BaseEntity 的 updated_at / deleted_at)。
-- 不建 FK:生产 REFERENCES operators(id) / users(id),而测试库无 operators 表;
-- 本库 review_tasks / local_eligibility_evidences 同样只保留列、不建 FK。
CREATE TABLE sensitive_access_logs (
id VARCHAR(36) PRIMARY KEY, operator_id VARCHAR(36), user_id VARCHAR(36),
data_type VARCHAR(64), reason VARCHAR(500), ip VARCHAR(64),
access_target VARCHAR(128), access_result VARCHAR(32),
created_at TIMESTAMP WITH TIME ZONE, updated_at TIMESTAMP WITH TIME ZONE, deleted_at TIMESTAMP WITH TIME ZONE
);
-- V019: home_banners 首页 Banner
CREATE TABLE home_banners (
id VARCHAR(36) PRIMARY KEY, title VARCHAR(200), subtitle VARCHAR(300), image_file_id VARCHAR(36),