2011-01-11 14 views
5

Ich erstelle ein benutzerdefiniertes Foto-CMS-System und muss ein Benutzerauthentifizierungs- und Berechtigungssystem implementieren. Was sind die üblichen Praktiken in der Branche, um ein solches Schema zu erstellen?So strukturieren Benutzerrechte für ein cms

Grundsätzlich brauche ich Benutzer, und Benutzer können von unterschiedlicher Art sein. Einige Benutzer können sagen, dass sie nur Galerien erstellen können, andere können sie nur bearbeiten oder nur bestimmte Galerien usw. bearbeiten. Wie sollte das strukturiert sein? Ich benutze MySQL Datenbank und ich benutze PHP, um das CMS zu kodieren.

Ich habe versucht, in Google jedoch nur gefundene Artikel zu suchen, die erklären, wie man Benutzer für die tatsächliche MySQL-Datenbank erstellt. Ich werde einen Link zu einem Artikel schätzen, der erklärt, wie solche Sachen gemacht werden sollten.

Vielen Dank im Voraus.

+0

Schauen Sie in PEAR Live_User. Es ist etwas alt und wurde nie ein Standard, aber es behandelt die meisten Berechtigungen Mikromanagement. – mario

Antwort

5

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.