ReBAC
什么是 ReBAC?
ReBAC(Relationship-Based Access Control,基于关系的访问控制) 依据实体之间的关系(用户—资源、资源—类型等)进行授权,而不是仅依赖角 色或属性。它适用于具有丰富关系图谱的系统:社交网络、协作工具、多租户应用等。
ReBAC 通常回答的问题:
- 用户是否是该资源的 owner(所有者)?
- 用户是否是拥有该资源的 project(项目)的 member(成员)?
- 资源是否属于用户有权访问的某个 type(类型)?
关系通常被建模为图或路径。
Casbin 中的 ReBAC
Casbin 通过以下方式建模 ReBAC:
- 用户—资源—角色关系:"用户 U 在资源 O 上拥有角色 R"(例如
alice是doc1上的collaborator)。 - 资源—类型关系:"资源 O 属于类型 T"(例如
doc1属于类型doc)。
随后,权限即"角色 R 可以在类型 T 上执行操作 A";如果用户在一个属于类型 T 的资源上拥有角色 R,该用户就获得该权限。示例 model:
[request_definition]
r = sub, obj, act
[policy_definition]
p = role, obj_type, act
[role_definition]
g = _, _, _
g2 = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, r.obj, p.role) && g2(r.obj, p.obj_type) && r.act == p.act
# Permission definition: The "collaborator" role can read files of type "doc"
p, collaborator, doc, read
# User-Resource-Role Relationship: alice is a collaborator of doc1
g, alice, doc1, collaborator
# Resource-Type Relationship: doc1 is of type "doc"
g2, doc1, doc
因此:用户必须在资源上拥有正确的角色,且资源必须与权限规则中的类型相匹配。Casbin 结合 g(用户—资源—角色)、g2(资源—类型)和 p(角色—类型—操作)来决定是否准许访问。