RBAC with Domains
与域租户的角色定义
Casbin中的RBAC角色可以是全局的或特定于域的。 特定于域的角色意味着当用户在不同的域/租户中时,用户的角色可以不同。 对于像云这样的大型系统,这非常有用,因为用户通常在不同的租户中。
与域/租户的角色定义应该如下所示:
[role_definition]
g = _, _, _
第三个_
代表域/租户的名称,这部分不应该改变。 然后策略可以是:
p, admin, tenant1, data1, read
p, admin, tenant2, data2, read
g, alice, admin, tenant1
g, alice, user, tenant2
这意味着tenant1
中的admin
角色可以读取data1
。 并且alice
在tenant1
中拥有admin
角色,在tenant2
中拥有user
角色。 因此,她可以读取data1
。 然而,由于alice
在tenant2
中不是admin
,她无法读取data2
。
然后,在匹配器中,你应该按照以下方式检查角色:
[matchers]
m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.act
请参考rbac_with_domains_model.conf以获取示例。
令牌名称约定
注意:按照惯例,策略定义中的域令牌名称是dom
,并作为第二个令牌(sub, dom, obj, act
)放置。
现在,Golang Casbin支持自定义令牌名称和放置。 如果域令牌名称是dom
,则无需任何额外操作,域令牌可以放置在任意位置。 如果域令牌名称不是dom
,则无论其位置如何,都应在初始化执行器后调用e.SetFieldIndex()
以获取constant.DomainIndex
。
# `domain` here for `dom`
[policy_definition]
p = sub, obj, act, domain
e.SetFieldIndex("p", constant.DomainIndex, 3) // index starts from 0
users := e.GetAllUsersByDomain("domain1") // without SetFieldIndex, it will raise an error