Passer au contenu principal

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.

Convention de nom de jeton

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