OrBAC
什么是 OrBAC?
OrBAC(组织化访问控制,Organisation-Based Access Control) 在 RBAC 基础上扩展了 抽象 和一个 组织 维度。策略引用的是 role、activity 和 view;具体的 user、action 和 object 则按组织映射到它们之上。这样即使实体发生变化,策略也能保持稳定。
三种映射(都以组织为作用域):
- Empower — user → role
- Use — action → activity
- Consider — object → view
当请求的 (subject, action, object) 映射到该组织中拥有权限的 (role, activity, view) 时,即授予权限。
模型
[request_definition]
r = sub, org, obj, act
[policy_definition]
p = role, activity, view, org
[role_definition]
g = _, _, _
g2 = _, _, _
g3 = _, _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, p.role, r.org) && g2(r.act, p.activity, r.org) && g3(r.obj, p.view, r.org) && r.org == p.org
g— subject 在该组织中拥有该角色(Empower)g2— action 是该组织中的一个活动(Use)g3— object 属于该组织中的一个视图(Consider)r.org == p.org— 同一个组织
策略示例
权限规则 指定在每个组织中,哪些角色可以对哪些视图执行哪些活动:
# Permission: role, activity, view, organization
p, manager, modify, document, org1
p, manager, consult, document, org1
p, employee, consult, document, org1
p, manager, modify, report, org2
p, manager, consult, report, org2
p, employee, consult, report, org2
Empower 规则 在组织内为 subject 分配角色:
# Empower: subject, role, organization
g, alice, manager, org1
g, bob, employee, org1
g, charlie, manager, org2
g, david, employee, org2
Use 规则 把具体 action 映射到抽象 activity:
# Use: action, activity, organization
g2, write, modify, org1
g2, read, consult, org1
g2, write, modify, org2
g2, read, consult, org2
Consider 规则 把具体 object 映射到抽象 view:
# Consider: object, view, organization
g3, data1, document, org1
g3, data2, document, org1
g3, report1, report, org2
g3, report2, report, org2
代码示例
import "github.com/casbin/casbin/v3"
e, _ := casbin.NewEnforcer("examples/orbac_model.conf", "examples/orbac_policy.csv")
// alice is a manager in org1, can read and write documents
ok, _ := e.Enforce("alice", "org1", "data1", "read") // true
ok, _ = e.Enforce("alice", "org1", "data1", "write") // true
// bob is an employee in org1, can only read documents
ok, _ = e.Enforce("bob", "org1", "data1", "read") // true
ok, _ = e.Enforce("bob", "org1", "data1", "write") // false
// charlie is a manager in org2, can read and write reports
ok, _ = e.Enforce("charlie", "org2", "report1", "read") // true
ok, _ = e.Enforce("charlie", "org2", "report1", "write") // true
// Cross-organization access is denied
ok, _ = e.Enforce("alice", "org2", "report1", "read") // false
ok, _ = e.Enforce("charlie", "org1", "data1", "read") // false
优势
- 抽象 — 策略使用 role、activity 和 view;你可以改变具体映射而无需重写策略。
- 按组织隔离 — 每个组织都有自己的映射和权限;一个模型即可覆盖全部。
- 可扩展性 — 在多组织场景中规则更少、更清晰。