RBAC with Domains
Definizione del Ruolo con Tenant di Dominio
I ruoli RBAC in Casbin possono essere globali o specifici del dominio. I ruoli specifici del dominio significano che i ruoli per un utente possono essere diversi quando l'utente si trova in diversi domini/tenant. Questo è molto utile per grandi sistemi come un cloud, poiché gli utenti sono solitamente in diversi tenant.
La definizione del ruolo con domini/tenant dovrebbe apparire così:
[role_definition]
g = _, _, _
Il terzo _
rappresenta il nome del dominio/tenant, e questa parte non dovrebbe essere cambiata. Quindi la politica può essere:
p, admin, tenant1, data1, read
p, admin, tenant2, data2, read
g, alice, admin, tenant1
g, alice, user, tenant2
Ciò significa che il ruolo admin
in tenant1
può leggere data1
. E alice
ha il ruolo admin
in tenant1
e il ruolo user
in tenant2
. Pertanto, lei può leggere data1
. Tuttavia, poiché alice
non è un admin
in tenant2
, non può leggere data2
.
Quindi, in un matcher, dovresti controllare il ruolo come segue:
[matchers]
m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.act
Si prega di fare riferimento al rbac_with_domains_model.conf per esempi.
Nota: Convenzionalmente, il nome del token del dominio nella definizione della politica è dom
e viene posizionato come secondo token (sub, dom, obj, act
).
Ora, Golang Casbin supporta nomi di token personalizzati e posizionamento. Se il nome del token del dominio è dom
, il token del dominio può essere posizionato in una posizione arbitraria senza alcuna azione aggiuntiva. Se il nome del token di dominio non è dom
, e.SetFieldIndex()
per constant.DomainIndex
dovrebbe essere chiamato dopo l'inizializzazione dell'enforcer, indipendentemente dalla sua posizione.
# `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