chenxing 3dac43dcfc t15:匿名通道落地——/anon/form 三端点 + HMAC cookie 防重 + 提交管线分通道
- 新 controller/anon/AnonFormController(RequestMapping /anon/form,不带 /api:CAS starter
  的 6 个 Filter 只挂 /api/* 且无豁免位,A11):resolve/submit/upload 三端点,签名里不出现 BoaUser。
- FormDefService 抽出 publishedOf 共用生命周期判定,新增 resolvePublishedForAnon/resolveForAnon:
  全域取"已发布未删 + audience 含 ANONYMOUS",非匿名/草稿/停用/不存在/跨校歧义同一句"表单不存在"
  (C6/V54 防探测;歧义 fail-closed 见 P119);出参复用登录面同一个组装实现。
- AnswerService 提交身份收成 SubmitIdentity(ofSession/ofAnon 两个工厂,通道由入口显式声明而不是
  从 user==null 反推):匿名面 sch_id/submitter_sch_id=表单归属校、submitter_id=0、subject_id 留 NULL、
  不进人群门也不占 fill_quota,值校验/附件/钉版/报名号/索引一段代码共用(V56/V57/V60)。
- 新 AnonReplayGuard:cookie 值=服务端 HMAC 时间戳(密钥复用 yh.app-auth.app-secret,零新增配置项、
  零服务端会话状态),窗口按 form.anon_cookie_minutes;伪造/篡改/跨表单按"没带 cookie"放行,
  命中=CUSTOM(5) 文案含剩余分钟;只在真提交成功时签发,幂等重放优先于节流且不续窗口(C7)。
- AnonModels 分 DTO:匿名请求体结构性没有 subjectId;Context 只从 HTTP 请求取(IP/UA/节流剩余秒)。
- FormFileService 加 uploadForTenant(schId, file)(匿名上传落表单归属校,否则提交侧附件归属查不到);
  五条硬约束一条不分叉。留痕按列宽截断落 answer.anon_ip/anon_ua(列在 t12 DDL 已预建,本批启用)。

测试:新增 AnonFillIT(V67,8 例:防探测文案等值、落库形态、平台级租户 0、窗口内二发 CUSTOM(5)、
伪造无效、幂等命中优先、窗口按表单配置、上传落档校)+ AnonReplayGuardTest(7 例:窗口边界与密钥缺失
fail-closed)。门禁 mvn -B -o clean test → Tests run: 265, Failures: 0, Errors: 0。
落地差额登记 P119/P121/P122/P123(详见 docs/T12-T18-report.md §1)。
2026-10-20 14:04:42 +08:00
2026-10-14 11:41:44 +08:00
2026-10-14 11:41:39 +08:00

form-center-service

managed by projman

S
Description
managed by projman
Readme
1.2 MiB
Languages
Java 99.9%