Zum Hauptinhalt springen

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.

notiz
  1. Casbin speichert nur die Benutzer-Rollen-Zuordnung.
  2. 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.
  3. 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 Rolle alice angeben. Sie können dies einfach lösen, indem Sie role_alice verwenden.
  4. Wenn A die Rolle B hat und B die Rolle C hat, dann hat A die Rolle C. Diese Transitivität ist momentan unendlich.
Token-Namen-Konvention

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.