Pular para o conteúdo principal

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.

Convenção de Nome de Token

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