4. ReBAC 模型原理与构成:关系图谱、关系推断、关系传播

4.1 模型边界:ReBAC 解决什么问题

ReBAC(Relationship-Based Access Control,基于关系的访问控制)将权限决策从“用户拥有什么角色/属性”转向“用户与资源之间存在什么关系”。其核心边界在于:当授权逻辑天然依赖实体间的社交、组织、层级或图谱关系时,RBAC 或 ABAC 往往需要维护大量冗余关系属性或复杂策略表达式,而 ReBAC 通过关系图谱统一表达。

对比维度RBACABACReBAC
关系描述方式角色层级(继承)策略中枚举关系属性显式关系边
关系变更影响角色定义变更策略重写或扩展仅关系边变更
典型场景企业员工岗位资源标签/环境社交网络、文档协作、图谱权限
ReBAC 的边界不是替代 RBAC/ABAC,而是处理“关系驱动型权限”的最优解。当权限判断需要遍历多跳关系(如“好友的好友”)或动态生成关系路径时,ReBAC 的图遍历能力无法被其他模型低成本复制。

4.2 分层职责:关系图谱层的三块积木

ReBAC 架构通常划分为三层:

  1. 关系存储层:以图数据库(如 Neo4j)或专用关系引擎(如 Google Zanzibar)保存实体节点与关系边。每条边为 (subject, relation, object) 三元组。
  2. 推断引擎层:负责执行关系推断(Transitive Closure)和关系传播,根据预设的图规则推导出隐式关系。
  3. 决策点层:接收请求 (用户, 动作, 资源),在关系图谱中查询是否存在符合授权路径的关系链。
ReBAC 分层职责对比
层核心职责典型组件输入/输出
关系存储层持久化关系三元组,支持图遍历Neo4j、Dgraph、CayleyCRUD 关系边
推断引擎层关系推断(闭包)、关系传播规则自定义 GraphQL 解析器 / Rego 规则隐式关系集合
决策点层检查指定路径是否存在PDP(Policy Decision Point)是否授权

4.3 数据流与信任链路:关系推断如何执行

关系推断是 ReBAC 的核心机制。典型推断规则包括:

  • 直接关系:用户 X 拥有资源 R 的 owner 关系 → 允许 delete。
  • 传递闭包:用户 X 是部门 D 的 member,部门 D 是项目 P 的 owner → X 可读 P 的文档。
  • 关系传播:用户 X 对资源 R 有 edit 关系,R 被共享给群组 G,X 是 G 的 member → X 可 edit R(需传播规则)。

数据流路径:

  1. 请求到达决策点层,携带 (subject, action, resource)。
  2. 决策点层将动作映射为所需的关系集合(如 “view” 映射为 viewer | editor | owner)。
  3. 调用推断引擎执行图查询或闭包运算,返回可达的隐式关系路径。
  4. 若存在任意一条路径,则授权通过。
信任链路风险:关系推断的递归深度若无限制,可能引发性能雪崩。生产环境必须设置最大跳数(如 5 跳)并缓存中间结果。

4.4 ReBAC 关系图谱核心结构

ReBAC 关系图谱结构示例 用户:Alice 部门:研发 项目:Alpha 文档:Spec 推断引擎 关系闭包:member→owner→viewer 允许 Alice 查看 Spec 文档 member owner viewer

4.5 选型权衡:何时选择 ReBAC

权衡点优势劣势
关系表达能力天然支持多跳、循环、反向关系对简单角色场景过度设计
权限模型演进新增关系类型不影响已有边关系推断规则需严格版本管理
性能与扩展图遍历可配索引与缓存深度递归可能拖慢决策时间
生态与工具Zanzibar 规范(Google)、OpenFGA社区支持弱于 RBAC
建议:如果系统中“谁可以访问什么”的答案经常需要查询“A 是 B 的 C 的 D”这种多跳关系,ReBAC 可节省 80% 的策略维护成本。反之,若关系深度不超过 2 层,用 ABAC 的嵌套属性即可。

4.6 风险点

  • 关系爆炸:每对实体间的关系边数量可能随用户规模平方增长,需设计压缩策略(如组节点、关系类型聚合)。
  • 推断循环:错误配置的传递规则可能导致无限递归,必须设置最大跳数并用有向无环图约束。
  • 数据一致性:关系图谱在分布式环境下的事务边界模糊,建议采用最终一致性 + 版本向量。
  • 管理界面复杂:运营人员需理解图概念,运维工具需要提供可视化关系编辑器。

4.7 落地步骤

  1. 关系建模:梳理实体类型(用户、组、资源)和关系类型(member、owner、viewer、editor 等),输出关系图 schema。
  2. 选择图存储引擎:推荐开源 OpenFGA(符合 Zanzibar 规范)或 Neo4j 自建。
  3. 定义推断规则:用 DSL 描述关系传递逻辑,如:
    define viewer: [owner, viewer]
    define editor: [owner]
    define owner: [owner]
  4. 集成决策点:在 API 网关或业务服务中调用关系检查 SDK(如 OpenFGA Client)。
  5. 性能压测:模拟多跳查询、高并发写入关系边,调优索引与缓存策略。
  6. 运维可视化:提供关系图谱管理后台,支持关系边 CRUD 及路径测试。

4.8 验收标准

验收项通过条件
直接关系授权Alice 是文档 Spec 的 owner → 可删除 Spec
两跳关系授权Alice 是研发 member,研发是 Alpha owner → Alice 可读取 Alpha 文档
三跳传播授权Alice 是研发 member,研发是项目 Alpha owner,项目 Alpha 包含文档 Spec → Alice 可查看 Spec
性能最坏 5 跳关系查询 ≤ 200ms(P99)
关系变更生效移除 Alice 的 member 关系后,5 秒内授权结果更新
验收时特别关注“隐式关系撤销”的延迟:关系传播链中某一环被删除后,下游所有派生关系必须全部失效。建议采用基于版本号的异步缓存失效策略。