Es gibt zwei gängige Ansätze für dieses Problem, beide beinhalten das Aufteilen der zulässigen Operationen in etwas Diskretes, das Sie benennen können. (Löschen Sie Beiträge, erstellen Sie Galerien, aktualisieren Sie den Code, legen Sie die Datenbank ab, starten Sie die Raketen, öffnen Sie das Garagentor). Geben Sie jedem eine Bitmap in einem Bitvektor (wenn Sie weniger als 32 Berechtigungen haben möchten, ist dies ein schöner und kompakte Speichermechanismus, wenn Sie denken, es wird wachsen über 32 Berechtigungen, die Größe einer typischen Integer, dann vielleicht eine Tabelle in Ihrer Datenbank ..)
So können Sie entweder Benutzer Berechtigungen direkt zuordnen ("I wollen zu sarnold
zu gewähren ") oder Sie können Benutzer und Berechtigungen über Benutzerklassen zuordnen (" Ich möchte gallery_create
an alle Mitglieder der art_curator
Klasse vergeben; dann möchte ich Benutzer sarnold
von docent
bis art_curator
fördern ").
Wenn Sie Benutzer Berechtigungen direkt zuordnen, finden Sie möglicherweise ein Sammelsurium seltsamer Berechtigungen in der Bereitstellung Jahre später. Wenn Sie Benutzer Klassen zuordnen, befinden Sie sich möglicherweise mit künstlichen Benutzerklassen, weil Sie einer bestimmten Person mit einer Berechtigung aber nicht mit anderen Berechtigungen vertraut haben.
Den besten Weg zu finden, um diese Abbildung zu adressieren, ist immer noch ein offenes Problem; Ich habe über verschiedene Typen von Berechtigungsmodellen Modelling a permissions system geschrieben, die zu viel oder zu wenig Informationen sind, je nachdem, wie kompliziert Ihr System werden soll.
Wenn Sie möchten, dass nur Speicherberechtigungen in Bitmaps (zB die Implementierung des Linux-Kernel von CAPABLE()
für CAP_SYS_ADMIN
, CAP_DAC_OVERRIDE
und so weiter), dann könnten Sie neue Privilegien hinzufügen mit etwas sehr einfach:
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;
...
Dann, wenn Sie die Fähigkeiten testen müssen:
if (CAPABLE(user, CAP_SYS_ADMIN))
reboot_server();
und die Makro CAPABLE()
kann wie folgt aussehen:
#define FäHIG (Benutzer, cap) ((Benutzer) -> Berechtigungen & (Cap))
(Verzeihen Sie die C, ich weiß nur nicht, php sehr gut; Ich war gezwungen, viel zu viele PHP-Fehler zu beheben, um es selbst zu lernen.)
Wenn Sie möchten, dass Benutzer Berechtigungen über Benutzerklassen abzubilden, könnte es dann drei Tabellen: a users
Tisch, ein groups
oder classes
Tisch und eine permissions
Tisch. classes
hat Spalten für user_id
und permission_id
. Wenn Sie prüfen müssen, ob eine Berechtigung erteilt werden kann, wählen Sie die Klasse des Benutzers aus und wählen Sie dann die Berechtigung in der Klasse aus. (Es ist auch Jahre her, dass ich SQL handgeschrieben habe; ich bin mir sicher, dass eine einzelne Abfrage eine Ja- oder Nein-Antwort geben kann, aber ich bin mir nicht sicher, ob es eine Mehrfachtabelle wäre oder Unterabfragen oder ob sie verwendet würden wäre einfacher, zwei Abfragen an die Datenbank zu machen :)
Hoffe, das hilft.
Schauen Sie in PEAR Live_User. Es ist etwas alt und wurde nie ein Standard, aber es behandelt die meisten Berechtigungen Mikromanagement. – mario