RBAC with Domains
Rollendefinition mit Domain-Tenants
Die RBAC-Rollen in Casbin können global oder domänenspezifisch sein. Domänenspezifische Rollen bedeuten, dass die Rollen für einen Benutzer unterschiedlich sein können, wenn der Benutzer in verschiedenen Domänen/Tenants ist. Dies ist sehr nützlich für große Systeme wie eine Cloud, da Benutzer normalerweise in verschiedenen Tenants sind.
Die Rollendefinition mit Domänen/Tenants sollte so aussehen:
[role_definition]
g = _, _, _
Das dritte _
repräsentiert den Namen der Domäne/des Tenants und dieser Teil sollte nicht geändert werden. Dann kann die Richtlinie so aussehen:
p, admin, tenant1, data1, read
p, admin, tenant2, data2, read
g, alice, admin, tenant1
g, alice, user, tenant2
Das bedeutet, dass die admin
-Rolle in tenant1
data1
lesen kann. Und alice
hat die admin
-Rolle in tenant1
und die user
-Rolle in tenant2
. Daher kann sie data1
lesen. Da alice
jedoch kein admin
in tenant2
ist, kann sie data2
nicht lesen.
Dann sollten Sie in einem Matcher die Rolle wie folgt überprüfen:
[matchers]
m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.act
Bitte beziehen Sie sich auf die rbac_with_domains_model.conf für Beispiele.
Hinweis: Üblicherweise ist der Domain-Token-Name in der Richtliniendefinition dom
und wird als zweites Token (sub, dom, obj, act
) platziert.
Jetzt unterstützt Golang Casbin benutzerdefinierte Token-Namen und Platzierung. Wenn der Domain-Token-Name dom
ist, kann der Domain-Token ohne zusätzliche Aktion an einer beliebigen Position platziert werden. Wenn der Domain-Token-Name nicht dom
ist, sollte e.SetFieldIndex()
für constant.DomainIndex
aufgerufen werden, nachdem der Durchsetzer initialisiert wurde, unabhängig von seiner 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