Expand description
RBAC 动态策略引擎(core 层判决插件;静态白名单引擎见 crate::permission)
与静态引擎的叠加语义(deny-wins):RBAC 判决叠加在静态判决之后,任一拒绝即
拒绝;字段维度取交集;行条件与静态 owner 条件 $and。策略未注入(registry.rbac()
为 None)时全部原语直通,行为与现状逐位一致——增量收紧,永不放大既有权限面。
两个容易搞反的维度:
- grant 之间(同一用户多角色 / 多 grant):OR(任一 grant 授予即放行其 条件命中的行 / 并集字段)——授权是并集;
- 引擎之间(静态白名单 × RBAC):AND(deny-wins)——收紧取交集。
行为契约(与 crate::permission 一致,勿破坏):
ctx: None/internal/super_admin/admin→ RBAC 不介入(直通);- 拒绝一律携带
ERR_PERMISSION:稳定前缀(宿主按前缀映射 PermissionError), 二级标识RBAC:供日志与测试区分。
Structs§
- Grant
- Model
Decision - 单模型判决视图(
decide产出) - Rbac
Policy
Enums§
- Rbac
Mode - 策略模式:
- Write
Action - 写动作粒度(对齐静态引擎
check_write_perm的ERR_NO_WRITE/ERR_NO_DELETE分派)
Functions§
- decide
- 核心判决:
None= RBAC 不介入(无 ctx / internal / 豁免角色 / overlay 未覆盖 / enforce 未受管)。enforce 受管但 matched 为空 →Some(全 deny),这是 default deny 的承载点。 - deny_
msg - 拒绝哨兵:复用
ERR_PERMISSION:前缀(宿主零改动映射 403),二级标识RBAC: - ensure_
read - 表级读判定(叠加在
can_read_schema之后) - ensure_
write - 表级写判定(叠加在
can_write_schema之后;upsert 路径裁定按 Insert 判) - ensure_
write_ on_ doc - 探针重入判决(单条 update/remove 的 ownerOnly / condition 命中判定)。
- filter_
writable_ data_ overlay - 写入数据过滤(RBAC 感知版,供写路径调用点整体替换
permission::filter_writable_data):可写字段 = 静态 writable ∩ RBAC writeFields。 与crate::permission::filter_writable_data逐行同构(_id豁免、点号按 root), 仅集合来源叠加 RBAC 交集——静态引擎文件零改动。 - is_
field_ readable_ overlay - 单字段可读判定(RBAC 感知版):静态
is_field_readable∧ RBAC readFields。 点号路径按 root 字段判定(与静态语义一致);ctx=None/ internal / RBAC 未生效 → 放行。 - merge_
row_ condition - 在静态引擎产出的 owner 条件(
merge_owner_condition结果)之上叠加 RBAC 行 条件:两引擎间$and(deny-wins)。任一为None→ 取另一者;空对象视为无条件。 - overlay_
readable_ fields - 字段读交集:
base(静态get_readable_fields结果)与 RBAC readFields 取交。_id随 base 保留(文档标识豁免,同filter_writable_data的 D-03 理由)。 - overlay_
writable_ fields - 字段写交集(语义同
overlay_readable_fields,作用于 writeFields) - probe_
condition_ fields - 探针命令需额外投影的字段(单条 update/remove 的 RBAC 行级判定依赖):
各 grant condition 的字段键(ownerOnly 的
createdBy由调用方静态并入)。 无 RBAC 行级限制 → 空表(调用方维持既有{_id, createdBy}投影)。 - row_
condition - 行级条件(grant 间 OR 合并):RBAC 未生效 / 存在无行限制的匹配 grant →
None(不收紧);否则各 grant 行限制取$or串接。action∈ {“read”, “update”, “remove”}(insert 无行级语义,调用方不传)。 - write_
action_ from_ str - action 字符串 →
WriteAction;非法值显式 Err(禁静默回落)