RBAC
Rollen-Definition
Die [role_definition]
wird verwendet, um die RBAC-Rollen-Erbschaftsbeziehungen zu definieren. Casbin unterstützt mehrere Instanzen von RBAC-Systemen, in denen Benutzer Rollen und deren Erbschaftsbeziehungen haben können, und Ressourcen können ebenfalls Rollen und deren Erbschaftsbeziehungen haben. Diese beiden RBAC-Systeme stören sich nicht gegenseitig.
Dieser Abschnitt ist optional. Wenn Sie in dem Modell keine RBAC-Rollen verwenden, dann lassen Sie diesen Abschnitt aus.
[role_definition]
g = _, _
g2 = _, _
Die obige Rollendefinition zeigt, dass g
ein RBAC-System ist und g2
ein anderes RBAC-System ist. _,_
bedeutet, dass zwei Parteien an einer Erbschaftsbeziehung beteiligt sind. Im häufigsten Fall verwenden Sie normalerweise g
allein, wenn Sie nur Rollen für Benutzer benötigen. Sie können auch sowohl g
als auch g2
verwenden, wenn Sie Rollen (oder Gruppen) für Benutzer und Ressourcen benötigen. Bitte sehen Sie sich die rbac_model.conf und rbac_model_with_resource_roles.conf für Beispiele an.
Casbin speichert die tatsächliche Benutzer-Rollen-Zuordnung (oder Ressourcen-Rollen-Zuordnung, wenn Sie Rollen auf Ressourcen verwenden) in der Richtlinie. Zum Beispiel:
p, data2_admin, data2, read
g, alice, data2_admin
Das bedeutet, dass alice
die Rolle data2_admin
erbt/ist ein Mitglied der Rolle data2_admin
. Hier kann alice
ein Benutzer, eine Ressource oder eine Rolle sein. Casbin erkennt es nur als Zeichenkette.
Dann sollten Sie in einem Matcher die Rolle wie unten gezeigt überprüfen:
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
Das bedeutet, dass das sub
in der Anfrage die Rolle sub
in der Richtlinie haben sollte.
- Casbin speichert nur die Benutzer-Rollen-Zuordnung.
- Casbin überprüft nicht, ob ein Benutzer ein gültiger Benutzer oder eine Rolle eine gültige Rolle ist. Das sollte durch die Authentifizierung geregelt werden.
- Verwenden Sie nicht den gleichen Namen für einen Benutzer und eine Rolle innerhalb eines RBAC-Systems, denn Casbin erkennt Benutzer und Rollen als Zeichenketten, und es gibt keine Möglichkeit für Casbin zu wissen, ob Sie den Benutzer
alice
oder die Rollealice
angeben. Sie können dies einfach lösen, indem Sierole_alice
verwenden. - Wenn
A
die RolleB
hat undB
die RolleC
hat, dann hatA
die RolleC
. Diese Transitivität ist momentan unendlich.
Konventionell ist der Subjekt-Token-Name in der Richtliniendefinition sub
und wird am Anfang platziert. Jetzt unterstützt Golang Casbin angepasste Token-Namen und -Plätze. Wenn der Subjekt-Token-Name sub
ist, kann der Subjekt-Token an einer beliebigen Stelle platziert werden, ohne dass eine zusätzliche Aktion erforderlich ist. Wenn der Name des Subjekt-Tokens nicht sub
ist, sollte e.SetFieldIndex()
für constant.SubjectIndex
aufgerufen werden, nachdem der Durchsetzer initialisiert wurde, unabhängig von seiner Position.
# `subject` here is for sub
[policy_definition]
p = obj, act, subject
e.SetFieldIndex("p", constant.SubjectIndex, 2) // index starts from 0
ok, err := e.DeleteUser("alice") // without SetFieldIndex, it will raise an error
Rollenhierarchie
Casbins RBAC unterstützt die Rollenhierarchie-Funktion von RBAC1, was bedeutet, dass wenn alice
role1
hat, und role1
role2
hat, dann wird alice
auch role2
haben und deren Berechtigungen erben.
Hier haben wir ein Konzept, das als Hierarchieebene bezeichnet wird. In diesem Beispiel beträgt die Hierarchieebene also 2. Für den eingebauten Rollenmanager in Casbin können Sie die maximale Hierarchieebene festlegen. Der Standardwert ist 10. Das bedeutet, dass ein Endbenutzer wie alice
nur 10 Rollenebenen erben kann.
// NewRoleManager is the constructor for creating an instance of the
// default RoleManager implementation.
func NewRoleManager(maxHierarchyLevel int) rbac.RoleManager {
rm := RoleManager{}
rm.allRoles = &sync.Map{}
rm.maxHierarchyLevel = maxHierarchyLevel
rm.hasPattern = false
return &rm
}
Wie unterscheidet man Rolle von Benutzer?
Casbin unterscheidet in seinem RBAC nicht zwischen Rollen und Benutzern. Beide werden als Zeichenketten behandelt. Wenn Sie nur ein einstufiges RBAC verwenden (wo eine Rolle niemals Mitglied einer anderen Rolle sein wird), können Sie e.GetAllSubjects()
verwenden, um alle Benutzer zu erhalten und e.GetAllRoles()
um alle Rollen zu erhalten. Sie werden alle u
und alle r
auflisten, jeweils in allen g, u, r
Regeln.
Aber wenn Sie ein mehrstufiges RBAC (mit Rollenhierarchie) verwenden und Ihre Anwendung nicht aufzeichnet, ob ein Name (Zeichenkette) ein Benutzer oder eine Rolle ist, oder Sie einen Benutzer und eine Rolle mit dem gleichen Namen haben, können Sie der Rolle ein Präfix wie role::admin
hinzufügen, bevor Sie es an Casbin weitergeben. Auf diese Weise werden Sie wissen, ob es sich um eine Rolle handelt, indem Sie dieses Präfix überprüfen.
Wie fragt man implizite Rollen oder Berechtigungen ab?
Wenn ein Benutzer eine Rolle oder Berechtigung über die RBAC-Hierarchie erbt, anstatt sie direkt in einer Richtlinienregel zugeordnet zu bekommen, nennen wir diese Art der Zuweisung "implizit". Um solche impliziten Beziehungen abzufragen, müssen Sie diese beiden APIs verwenden: GetImplicitRolesForUser()
und GetImplicitPermissionsForUser()
anstelle von GetRolesForUser()
und GetPermissionsForUser()
. Für weitere Details siehe bitte dieses GitHub-Issue.
Verwendung von Musterabgleich in RBAC
Siehe RBAC mit Muster
Rollenmanager
Siehe den Abschnitt Rollenmanager für Details.