RBAC with Domains
Definição de Papel com Locatários de Domínio
As funções RBAC no Casbin podem ser globais ou específicas de domínio. Papéis específicos de domínio significam que os papéis de um usuário podem ser diferentes quando o usuário está em diferentes domínios/locatários. Isto é muito útil para sistemas grandes como uma nuvem, pois os usuários geralmente estão em diferentes locatários.
A definição de papel com domínios/locatários deve parecer assim:
[role_definition]
g = _, _, _
O terceiro _
representa o nome do domínio/locatário, e esta parte não deve ser alterada. Então a política pode ser:
p, admin, tenant1, data1, read
p, admin, tenant2, data2, read
g, alice, admin, tenant1
g, alice, user, tenant2
Isto significa que o papel de admin
em tenant1
pode ler data1
. E alice
tem o papel de admin
em tenant1
e o papel de user
em tenant2
. Portanto, ela pode ler data1
. No entanto, como alice
não é uma admin
em tenant2
, ela não pode ler data2
.
Então, em um comparador, você deve verificar o papel da seguinte forma:
[matchers]
m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.act
Por favor, consulte o rbac_with_domains_model.conf para exemplos.
Observação: Convencionalmente, o nome do token de domínio na definição de política é dom
e é colocado como o segundo token (sub, dom, obj, act
).
Agora, o Casbin em Golang suporta nomes de tokens personalizados e colocação. Se o nome do token de domínio for dom
, o token de domínio pode ser colocado em uma posição arbitrária sem nenhuma ação adicional. Se o nome do token de domínio não for dom
, e.SetFieldIndex()
para constant.DomainIndex
deve ser chamado após o inicializador ser inicializado, independentemente de sua posição.
# `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