Menu Permissions
Wir beginnen mit der Vorstellung eines Spring Boot-Beispiels mit einem Menüsystem. Dieses Beispiel nutzt jCasbin zur Verwaltung von Menüberechtigungen. Letztendlich zielt es darauf ab, eine Middleware zu abstrahieren, speziell für Menüberechtigungen, die auf andere von Casbin unterstützte Sprachen, wie Go und Python, erweitert werden könnte.
1. Konfigurationsdateien
Sie müssen die Rollen- und Berechtigungsverwaltung in der policy.csv
-Datei einrichten, zusammen mit den Eltern-Kind-Beziehungen zwischen Menüpunkten. Für weitere Details verweisen Sie bitte auf dieses GitHub-Repo.
1.1 Übersicht
Mit policy.csv
können Sie flexibel Rollenberechtigungen und Menüstrukturen für feinkörnige Zugriffskontrolle konfigurieren. Diese Konfigurationsdatei definiert Zugriffsberechtigungen für verschiedene Rollen auf verschiedene Menüpunkte, Verbindungen zwischen Benutzern und Rollen und die hierarchischen Beziehungen zwischen Menüpunkten.
1.2 Berechtigungsdefinitionen (Richtlinien)
- Richtlinienregeln: Richtlinien werden mit einem
p
-Präfix definiert, das Rollen (sub
) und ihre Berechtigungen (act
) auf Menüpunkten (obj
) angibt, zusammen mit der Wirkung der Regel (eft
), wobeiallow
die Gewährung der Berechtigung anzeigt unddeny
ihre Ablehnung.
Beispiele:
p, ROLE_ROOT, SystemMenu, read, allow
bedeutet, dass die RolleROLE_ROOT
Lesezugriff auf den MenüpunktSystemMenu
hat.p, ROLE_ROOT, UserMenu, read, deny
bedeutet, dass der RolleROLE_ROOT
der Lesezugriff auf den MenüpunktUserMenu
verweigert wird.
1.3 Rollen und Benutzerzuordnungen
- Rollenvererbung: Benutzer-Rollen-Beziehungen und Rollenhierarchien werden mit einem
g
-Präfix definiert. Dies ermöglicht es Benutzern, Berechtigungen von einer oder mehreren Rollen zu erben.
Beispiele:
g, user, ROLE_USER
bedeutet, dass dem Benutzeruser
die RolleROLE_USER
zugewiesen wird.g, ROLE_ADMIN, ROLE_USER
bedeutet, dassROLE_ADMIN
Berechtigungen vonROLE_USER
erbt.
1.4 Hierarchie der Menüpunkte
- Menübeziehungen: Eltern-Kind-Beziehungen zwischen Menüpunkten werden mit einem
g2
-Präfix definiert, um beim Aufbau der Menüstruktur zu helfen.
Beispiele:
g2, UserSubMenu_allow, UserMenu
zeigt an, dassUserSubMenu_allow
ein Untermenü vonUserMenu
ist.g2, (NULL), SystemMenu
zeigt an, dassSystemMenu
keinen Untermenüpunkt hat, was bedeutet, dass es sich um einen obersten Menüpunkt handelt.
1.5 Vererbung von Menüberechtigungen und Standardregeln
Bei der Verwaltung von Menüberechtigungen mit jCasbin folgt die Berechtigungsbeziehung zwischen Eltern- und Kindermenüs spezifischen Vererbungsregeln, mit zwei wichtigen Standardregeln:
Vererbung von Elternmenüberechtigungen:
Wenn einem übergeordneten Menü explizit die allow
Berechtigung erteilt wird, haben alle seine Untermenüs standardmäßig auch die allow
Berechtigung, es sei denn, sie sind speziell als deny
gekennzeichnet. Das bedeutet, dass sobald ein übergeordnetes Menü zugänglich ist, auch seine Untermenüs standardmäßig zugänglich sind.
Behandlung von übergeordneten Menüs ohne direkte Berechtigungseinstellungen:
Wenn ein übergeordnetes Menü keine direkten Berechtigungseinstellungen hat (weder explizit erlaubt noch verweigert), aber mindestens ein Untermenü explizit die allow
Berechtigung hat, dann wird das übergeordnete Menü implizit als allow
Berechtigung betrachtet. Dies stellt sicher, dass Benutzer zu diesen Untermenüs navigieren können.
1.6 Spezielle Regeln zur Berechtigungsvererbung
Bezüglich der Vererbung von Berechtigungen zwischen Rollen, insbesondere in Szenarien mit deny
Berechtigungen, müssen die folgenden Regeln eingehalten werden, um die Systemsicherheit und die präzise Kontrolle von Berechtigungen zu gewährleisten:
Unterscheidung zwischen expliziten und standardmäßigen Verweigerungen:
Wenn einer Rolle, wie ROLE_ADMIN
, explizit der Zugriff auf einen Menüpunkt, wie AdminSubMenu_deny
(als deny
gekennzeichnet), verweigert wird, dann ist selbst wenn diese Rolle von einer anderen Rolle (z.B. ROLE_ROOT
) geerbt wird, der ererbenden Rolle der Zugriff auf den verweigerten Menüpunkt nicht gestattet. Dies stellt sicher, dass explizite Sicherheitsrichtlinien nicht aufgrund von Rollenvererbung umgangen werden.
Vererbung von standardmäßigen Verweigerungsberechtigungen:
Umgekehrt, wenn die Verweigerung einer Rolle des Zugriffs auf einen Menüpunkt (z.B. UserSubMenu_deny
) standardmäßig ist (nicht explizit als deny
gekennzeichnet, sondern weil sie nicht explizit allow
gewährt wurde), dann kann, wenn diese Rolle von einer anderen Rolle (z.B. ROLE_ADMIN
) geerbt wird, die ererbende Rolle den standardmäßigen deny
Status überschreiben und den Zugriff auf diese Menüpunkte erlauben.
1.7 Beispielbeschreibung
Richtlinie:
p, ROLE_ROOT, SystemMenu, read, allow
p, ROLE_ROOT, AdminMenu, read, allow
p, ROLE_ROOT, UserMenu, read, deny
p, ROLE_ADMIN, UserMenu, read, allow
p, ROLE_ADMIN, AdminMenu, read, allow
p, ROLE_ADMIN, AdminSubMenu_deny, read, deny
p, ROLE_USER, UserSubMenu_allow, read, allow
g, user, ROLE_USER
g, admin, ROLE_ADMIN
g, root, ROLE_ROOT
g, ROLE_ADMIN, ROLE_USER
g2, UserSubMenu_allow, UserMenu
g2, UserSubMenu_deny, UserMenu
g2, UserSubSubMenu, UserSubMenu_allow
g2, AdminSubMenu_allow, AdminMenu
g2, AdminSubMenu_deny, AdminMenu
g2, (NULL), SystemMenu
MenüName | ROLE_ROOT | ROLE_ADMIN | ROLE_USER |
---|---|---|---|
SystemMenu | ✅ | ❌ | ❌ |
UserMenu | ❌ | ✅ | ❌ |
UserSubMenu_allow | ❌ | ✅ | ✅ |
UserSubSubMenu | ❌ | ✅ | ✅ |
UserSubMenu_deny | ❌ | ✅ | ❌ |
AdminMenu | ✅ | ✅ | ❌ |
AdminSubMenu_allow | ✅ | ✅ | ❌ |
AdminSubMenu_deny | ✅ | ❌ | ❌ |
2. Menüberechtigungskontrolle
Die Liste aller Menüpunkte, auf die ein bestimmter Benutzername Zugriff hat, kann über die Funktion findAccessibleMenus()
identifiziert werden, die im MenuService verfügbar ist. Um zu überprüfen, ob ein bestimmter Benutzer die Rechte hat, auf einen bestimmten Menüpunkt zuzugreifen, kann die Methode checkMenuAccess()
verwendet werden. Dieser Ansatz stellt sicher, dass Menüberechtigungen effektiv kontrolliert werden und nutzt die Fähigkeiten von jCasbin zur effizienten Verwaltung von Zugriffsrechten.