Wie man ein hierarchisches rollenbasiertes Zugangskontrollsystem entwickelt
Basic Angebot ist, haben wir eine benutzerdefinierte gebaut "kickstart" für unsere Projekte. Für diesen suchen wir am wiederherstellen der Benutzer-Kontrolle. Ich weiß, es gibt eine Menge von Fragen gibt, über die Allgemeinen rbac, aber ich finde keine, die auf hierarchischen rbac?
Unsere Anforderungen sind:
- Rollen zugeordnet werden können, um eine Gruppe von Berechtigungen
- Wenn die Rolle nicht über eine Erlaubnis, die Einreise, dann ist es automatisch verweigert
- Um einem Benutzer das überschreiben von Berechtigungen
- Ein Benutzer überschreiben von Berechtigungen ist entweder gewähren oder verweigern
- Wenn ein Benutzer ausdrücklich verweigert eine Genehmigung, egal, welche Rollen sagen, "gewährt" dem überschreiben gewinnt.
- Benutzer können mehrere Rollen haben
- Rollen können Hierarchie
- Rollen Erben von anderen Rollen (z.B. "Forum Super Moderator" - Rolle ist ein "Forum-Moderator" und ein "System-Betreuer" und den "Forum-Moderator" Rolle bereits erbt von der "Forum-User" - Rolle )
- Rollen Erben von anderen Rolle gewähren oder verweigern ein Privileg, überschreiben Sie Ihrem Kind die Erlaubnis
- Berechtigungen sind gruppiert durch "Modul" (z.B. ein "Blog" - Modul kann ein "Eintrag Bearbeiten" Berechtigung", und ein "Forum" - Modul kann ein "Eintrag Bearbeiten" - Berechtigung, und Sie werden nicht clash)
- Es ist ein "Alles und Nichts" - Berechtigung automatisch gewährt vollen Zugriff
So, mit diesen Anforderungen aus dem Weg, hier ist, wie ich denke, es zu tun.
Tabelle: Benutzer
id | int | unique id
Tabelle: Rollen
id | int | unique id
-------------- | ---------------------------------------------
title | varchar | human readable name
Tabelle: Berechtigungen
id | int | unique id
-------------- | ---------------------------------------------
module | varchar | module name
-------------- | ---------------------------------------------
title | varchar | human readable name
-------------- | ---------------------------------------------
key | varchar | key name used in functions
Tabelle: Role_User
role_id | int | id from roles table
-------------- | ---------------------------------------------
user_id | int | id from users table
Tabelle: Permission_Role
id | int | unique id
-------------- | ---------------------------------------------
permission_id | int | id from permissions table
-------------- | ---------------------------------------------
role_id | int | id from roles table
-------------- | ---------------------------------------------
grant | tinyint | 0 = deny, 1 = grant
Tabelle: Permission_User
id | int | unique id
-------------- | ---------------------------------------------
permission_id | int | id from permissions table
-------------- | ---------------------------------------------
user_id | int | id from users table
-------------- | ---------------------------------------------
grant | tinyint | 0 = deny, 1 = grant
Naja, eigentlich ist das die Hälfte, der Teil, ich bin sicher, der Teil, den ich am stecken, ist die hierarchische Rollen.
Also, wie gestalte ich diese?
Meine Idee ist, dass zum speichern in der Datenbank Abfragen, ich bin gerade dabei zu bauen, die Erlaubnis matrix auf Anmeldung und speichern Sie es auf der Sitzung, so dass die Abfragen nicht zu einfach sein, da Sie nur einmal laufen bei jeder Anmeldung.
Das Problem, das ich sehe ist, dass ich bin gehen zu müssen, um zu wissen, die Hierarchie der Rollen, so kann ich beheben das geerbte Rollen-Berechtigungen, bevor ich beheben, die die Erben.
Berechtigungen Benutzer ist der einfache Teil, die pro-Benutzer-Berechtigungen sind im wesentlichen endgültig gelöst-Gruppe.
InformationsquelleAutor der Frage Hailwood | 2013-04-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es eine Möglichkeit zu implementieren, die Rolle der Vererbung durch die Verwendung rekursiver Bezug auf Tabelle
Roles
durch die Rolle Verweis auf einen anderen Datensatz:Dieser Beziehung fügen
1 : n
Vererbung innerhalbRoles
aufnehmen. Erzielen Sie möglicherweise den ganzen Hierarchie-Baum mit dieser gespeicherten Funktion:Dann, Sie könnten erhalten alle gewährt Berechtigungen mit so etwas wie dies:
Wenn es nicht genug ist, dann könnten Sie eine weitere Tabelle für die Vererbung:
Aber in diesem Fall, benötigt eine andere Hierarchie Erlangung Algorithmus.
Beheben überschreiben Problem, das Sie haben, um die Rolle von Berechtigungen sowie zu Benutzer-Berechtigungen. Dann schreiben Sie
user
Berechtigungen überroles
Berechtigungensession
.Auch, ich schlage vor, zu entfernen
grant
Spalten inPermission_Role
undPermission_User
. Es gibt keine Notwendigkeit, Karte jede Berechtigung für jede von Ihnen. Gerade genug, um zu verwendenEXISTS
Abfragen: wenn ein Eintrag vorhanden ist, dann wird das Recht eingeräumt, andere - ist es nicht. Wenn Sie brauchen, um alle Berechtigungen und der Status " können SieLEFT JOIN
s.InformationsquelleAutor der Antwort BlitZ