Skip to main content

Module rbac

Module rbac 

Source
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 / 豁免清单(exempt_roles,默认空)命中 → RBAC 不介入(直通);
  • 拒绝一律携带 ERR_PERMISSION: 稳定前缀(宿主按前缀映射 PermissionError), 二级标识 RBAC: 供日志与测试区分。

Structs§

Grant
ModelDecision
单模型判决视图(decide 产出)
RbacPolicy

Enums§

RbacMode
策略模式:
WriteAction
写动作粒度(对齐静态引擎 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(禁静默回落)