Zum Hauptinhalt springen

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.

Token-Namen-Konvention

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