RBAC with Domains
Définition de rôle avec des locataires de domaine
Les rôles RBAC dans Casbin peuvent être globaux ou spécifiques à un domaine. Les rôles spécifiques à un domaine signifient que les rôles d'un utilisateur peuvent être différents lorsque l'utilisateur se trouve dans différents domaines/locataires. Ceci est très utile pour les grands systèmes comme un cloud, car les utilisateurs sont généralement dans différents locataires.
La définition de rôle avec des domaines/locataires devrait ressembler à ceci :
[role_definition]
g = _, _, _
Le troisième _
représente le nom du domaine/locataire, et cette partie ne doit pas être modifiée. Ensuite, la politique peut être :
p, admin, tenant1, data1, read
p, admin, tenant2, data2, read
g, alice, admin, tenant1
g, alice, user, tenant2
Cela signifie que le rôle admin
dans tenant1
peut lire data1
. Et alice
a le rôle admin
dans tenant1
et le rôle user
dans tenant2
. Par conséquent, elle peut lire data1
. Cependant, comme alice
n'est pas une admin
dans tenant2
, elle ne peut pas lire data2
.
Ensuite, dans un comparateur, vous devriez vérifier le rôle comme suit :
[matchers]
m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.act
Veuillez vous référer à rbac_with_domains_model.conf pour des exemples.
Note : Conventionnellement, le nom du jeton de domaine dans la définition de la politique est dom
et est placé comme le deuxième jeton (sub, dom, obj, act
).
Maintenant, Golang Casbin prend en charge les noms de jetons personnalisés et leur placement. Si le nom du jeton de domaine est dom
, le jeton de domaine peut être placé à une position arbitraire sans aucune action supplémentaire. Si le nom du jeton de domaine n'est pas dom
, e.SetFieldIndex()
pour constant.DomainIndex
doit être appelé après l'initialisation de l'exécuteur, quelle que soit sa position.
# `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