Appearance
L03-13 Harness:把七道防护装进一个入口
全局中心内容:防护散落各处必然遗漏,唯一的解法是「所有执行必须经过一个入口」。 全局讲解主线:为什么需要 Harness → Guard 链设计 → 顺序 → 短路语义 → 编码 → 演示 → 扩展 → 验收。
P1 · 产出页
中心内容:一个 AgentHarness + 七道 Guard 的有序责任链。
- 讲解技巧
- 开场回顾:前面七节课讲了七道防护,问学员**「你怎么保证每个调用都过一遍?」**
- 答案:靠人自觉是不可能的,必须靠架构强制。
- 时长:30s
P2 · 为什么需要总装
中心内容:分散的防护会出现「某条链路漏了一道」。
- 讲解技巧
- 举真实例子:加了审批,但离线任务走的是另一个入口,绕过了审批。
- 结论:入口只要有两个,防护就会不一致。
- 时长:4min
P3 · Guard 接口
中心内容:一个极简接口,所有防护都实现它。
页面内容:
Guard { int getOrder(); GuardResult check(Context); }讲解技巧
- 强调接口要极简:输入上下文、输出结果,不耦合具体实现。
- 讲清返回值要能表达「通过 / 拒绝 / 需审批」三种语义。
时长:5min
P4 · 七道 Guard
中心内容:预算 → 循环 → 超时 → 熔断 → 权限 → 审批 → 审计。
页面内容:每道 Guard 的职责与触发动作
讲解技巧
- 逐道快速过一遍(每道 30 秒),让学员看到它们正好覆盖了前面七节。
- 这一页是本章的「合拢」时刻,要讲得有气势。
时长:6min
P5 · 顺序为什么重要
中心内容:便宜的检查放前面,贵的放后面。
页面内容:顺序图与错序的后果
讲解技巧
- 举例:审计放最前面会记录大量根本没执行的请求,既浪费又误导。
- 强调原则:先做能快速否决的检查。
时长:5min
P6 · 短路语义
中心内容:任何一道 Guard 拒绝,后面不再执行。
- 讲解技巧
- 讲清拒绝后也要走「收尾」:记录审计、通知用户、更新状态。
- 提醒:被拒绝不等于异常,要给出清晰的原因。
- 时长:4min
P7 · 编码:责任链装配
中心内容:利用 Spring 的集合注入自动按 order 排序。
页面内容:AgentHarness 实现与
List<Guard>注入讲解技巧
- 这是本节最漂亮的一处:新增一道防护只需加一个 Bean,不用改 Harness。
- 提醒 order 要留间隔(10、20、30),方便将来插入。
时长:7min
P8 · 现场演示
中心内容:故意触发每一道 Guard,看是否被拦下。
- 讲解技巧
- 演示清单:超预算 / 重复动作 / 超时 / 未授权工具 / 需审批 / 含敏感信息。
- 让学员看到六道全部生效,这是最有力的收尾。
- 时长:6min
P9 · 扩展与取舍
中心内容:Guard 太多会拖慢执行,要区分同步/异步。
- 讲解技巧
- 给建议:审计类 Guard 异步化,安全类必须同步。
- 时长:4min
P10 · 避坑与小结
中心内容:Harness 的价值是「防遗漏」,不是「防聪明人绕过」。
- 讲解技巧
- 强调配套措施:代码评审要检查「有没有绕过 Harness 的直接调用」。
- 引出下一节:装上 Harness 之后,做三个真实案例——03-14 起。
- 时长:2min
讲师备忘
| 项 | 内容 |
|---|---|
| 课前必做 | 准备七道 Guard 的清单;准备逐个触发的演示脚本 |
| 最容易超时处 | P8 演示,六道 Guard 逐一触发耗时——提前调好参数 |
| 学员最常问 | 「Guard 会影响性能吗?」答:同步安全检查是微秒级,可忽略 |
| 现场备用 | 演示失败 → 逐个看 Guard 的单元测试 |