Es gibt zwei gängige Ansätze für dieses Problem, bei denen es darum geht, die zulässigen Operationen in etwas Diskretes zu zerlegen, das man benennen kann. (Beiträge löschen, Galerien erstellen, den Code aktualisieren, die Datenbank entladen, die Raketen starten, das Garagentor öffnen). Geben Sie jeder dieser Operationen eine Bitmap in einem Bitvektor (wenn Sie vorhaben, weniger als 32 Berechtigungen zu haben, ist dies ein netter und kompakter Speichermechanismus; wenn Sie denken, dass es über 32 Berechtigungen hinausgeht, die Größe einer typischen Ganzzahl, dann vielleicht eine Tabelle in Ihrer Datenbank )
Sie können also entweder die Benutzer direkt den Berechtigungen zuordnen ("Ich möchte die gallery_create
à sarnold
") oder Sie können Benutzer und Berechtigungen über Benutzerklassen zuordnen ("Ich möchte gallery_create
an alle Mitglieder der art_curator
Klasse; dann möchte ich den Benutzer sarnold
de docent
à art_curator
").
Wenn Sie die Benutzer direkt den Berechtigungen zuordnen, kann es sein, dass Sie Jahre später bei der Bereitstellung ein Sammelsurium an seltsamen Berechtigungen vorfinden. Wenn Sie Benutzer zu Klassen zuordnen, kann es sein, dass Sie künstliche Benutzerklassen haben, weil Sie einer bestimmten Person eine Berechtigung zugestanden haben, anderen aber nicht.
Wie diese Zuordnung am besten zu bewerkstelligen ist, ist noch ein offenes Problem; ich habe über verschiedene Arten von Genehmigungsmodellen geschrieben Modellierung eines Berechtigungssystems Das können zu viele oder zu wenige Informationen sein, je nachdem, wie kompliziert Sie Ihr System gestalten möchten.
Wenn Sie Berechtigungen nur in Bitmaps speichern möchten (z. B. die Implementierung des Linux-Kernels von CAPABLE()
para CAP_SYS_ADMIN
, CAP_DAC_OVERRIDE
usw.), dann können Sie mit etwas sehr Einfachem neue Privilegien hinzufügen:
if (requested_new_permission == "CAP_SYS_ADMIN")
user->permissions |= CAP_SYS_ADMIN;
else if (requested_new_permissions == "CAP_DAC_OVERRIDE")
user->permissions |= CAP_DAC_OVERRIDE;
...
Wenn Sie dann die Fähigkeiten testen müssen:
if (CAPABLE(user, CAP_SYS_ADMIN))
reboot_server();
und das Makro CAPABLE()
aussehen kann:
define CAPABLE(user,cap) ((user)->Berechtigungen & (cap))
(Verzeihen Sie das C, ich kenne mich mit php einfach nicht gut aus; ich war gezwungen, viel zu viele php-Fehler zu beheben, als dass ich es selbst lernen wollte).
Wenn Sie Benutzer über Benutzerklassen den Berechtigungen zuordnen wollen, dann könnten es drei Tabellen sein: eine users
Tabelle, eine groups
o classes
Tabelle, und eine permissions
Tisch. classes
hat Spalten für user_id
y permission_id
. Wenn Sie prüfen müssen, ob eine Berechtigung erteilt werden kann, wählen Sie die Klasse des Benutzers und dann die Berechtigung in der Klasse aus. (Es ist auch schon Jahre her, dass ich SQL von Hand geschrieben habe; ich bin sicher, dass eine einzelne Abfrage eine Ja- oder Nein-Antwort liefern kann, aber ich bin mir nicht sicher, ob es eine Verknüpfung mehrerer Tabellen oder die Verwendung von Unterabfragen wäre oder ob es einfach einfacher wäre, zwei Abfragen an die Datenbank zu stellen :)
Ich hoffe, das hilft.