Skip to content

Commit d040c70

Browse files
committed
perf(plugin-audit): 审计跳过名单上到注册面,平台内部表不再买单前置行读 (#5860)
五个写入注册(captureBefore 的 beforeUpdate/beforeDelete,writeAudit 的 afterInsert/afterUpdate/afterDelete)此前不带任何对象范围,在引擎眼里全部是 全局 hook。SKIP_OBJECTS 这份知识停在 handler 早退里,注册面上看不见,于是 #5284 的单 id update() 前置行门与 #5038 的批量门只能保守判真,对 sys_job_queue 一类平台内部表每次写入白读一遍行集 —— 而 handler 第一行就返回。 现在五个注册带上 #5928 / PR #6575 落地的 excludeObjects,名单由 SKIP_OBJECTS 派生而非重抄,两个面无法各自漂移;handler 早退保留为纵深防御,审计行为守恒。 排除面(减法)而非允许列表(枚举补集):对象全集在运行期开放,枚举出来的名单 会在启动时冻结并静默漏审此后新建的对象。 顺带把 writeCommentMentions 收为 { object: 'sys_comment' } —— 封闭单名允许 列表,现有契约一直表达得了,行为不变。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JwwiU9bjhwy2SWj13ho8uv
1 parent 82397b6 commit d040c70

6 files changed

Lines changed: 613 additions & 19 deletions

File tree

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
---
2+
"@objectstack/plugin-audit": patch
3+
---
4+
5+
perf(plugin-audit): 审计跳过名单上到注册面,平台内部表不再为白读买单 (#5860)
6+
7+
plugin-audit 的五个写入注册(`captureBefore``beforeUpdate`/`beforeDelete`,
8+
`writeAudit``afterInsert`/`afterUpdate`/`afterDelete`)此前**不带任何对象范围**,
9+
因而在引擎眼里全部是全局 hook。"哪些对象要审计"这个知识一直存在 —— `SKIP_OBJECTS`
10+
—— 但它停在 handler 内部的早退里,注册面上看不见。于是按对象计算需求的两道门只能保守
11+
判真:#5284 的单 id `update()` 前置行门、#5038 的批量门,对 `sys_job_queue`
12+
`sys_job_run``sys_upload_session``ai_traces` 这些表同样判"需要",每次写入白读一遍
13+
行集,而 handler 的第一行就返回了。放大倍数最刺眼的是 `sys_job_queue`:每条队列消息
14+
至少三次写入(publish / lease / terminal),自 #5160 起每封邮件都走它。
15+
16+
现在这五个注册带上 `excludeObjects`(#5928 / PR #6575 落地的声明式排除面),名单由
17+
`SKIP_OBJECTS` **派生**而非重抄,两个面不可能各自漂移。handler 内的早退**保留**为纵深
18+
防御 —— 它护住的是每一个非 hook 调用方 —— 所以审计写入的行为逐位守恒,变的只是引擎
19+
能看见的范围。
20+
21+
**为什么是减法而不是允许列表**:对象全集在运行期是开放的。`/meta` PUT 会把新对象注册进
22+
运行中的引擎,而 `SchemaRegistry.registerObject` 不发任何事件,插件侧没有可订阅的通道去
23+
追平一份枚举出来的名单 —— 那样的名单会在启动时冻结,此后新建的对象**静默**不被审计,对
24+
合规插件是无声的倒退。排除面没有这个失败模式:安装时没人听说过的对象默认被审计。这条性质
25+
已单独钉在测试里。
26+
27+
顺带,`writeCommentMentions` 收为 `{ object: 'sys_comment' }` —— 它的 handler 第一行本就
28+
拒绝其他对象,这是一个封闭的单名允许列表,现有契约一直表达得了。行为不变,但它不再出现在
29+
其他任何对象的 `afterInsert` 需求里。

packages/plugins/plugin-audit/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"@objectstack/spec": "workspace:*"
2424
},
2525
"devDependencies": {
26+
"@objectstack/objectql": "workspace:*",
2627
"@types/node": "^26.1.2",
2728
"typescript": "^6.0.3",
2829
"vitest": "^4.1.10"

0 commit comments

Comments
 (0)