OrBAC
什么是 OrBAC?
OrBAC(基于组织的访问控制) 在 RBAC 的基础上增加了 抽象 和 组织 维度。策略引用的是 角色、活动 和 视图;具体的用户、操作和对象按组织映射到它们。这样实体变化时策略也能保持稳定。
三种映射(都以组织为范围):
- Empower:用户 → 角色
- Use:操作 → 活动
- Consider:对象 → 视图
当请求的(主体、操作、对象)映射到在该组织中有权限的(角色、活动、视图)时,授予权限。
模型
[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:主体在组织中拥有某角色(Empower)g2:操作在组织中属于某活动(Use)g3:对象在组织中属于某视图(Consider)r.org == p.org:同一组织
策略示例
Permission 规则 规定在每个组织中,哪些角色可以对哪些视图执行哪些活动:
# 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 规则 在组织内把角色分配给主体:
# Empower: subject, role, organization
g, alice, manager, org1
g, bob, employee, org1
g, charlie, manager, org2
g, david, employee, org2
Use 规则 把具体操作映射到抽象的活动:
# Use: action, activity, organization
g2, write, modify, org1
g2, read, consult, org1
g2, write, modify, org2
g2, read, consult, org2
Consider 规则 把具体对象映射到抽象的视图:
# 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
优点
- 抽象:策略使用角色、活动和视图;修改具体映射时无需重写策略。
- 按组织:每个组织有自己的映射和权限;一个模型覆盖全部。
- 可扩展性:在多组织环境中规则更少、更清晰。
Comments are powered by giscus and GitHub Discussions. They load from giscus.app and GitHub only after you click the button below.