45 Stimmen

Implementierung von Berechtigungen auf der Grundlage von Reputation

Ich erstelle eine Website, auf der es Projekte, Benutzer und Berechtigungen für jeden Benutzer oder jede Benutzergruppe gibt. Es handelt sich um ein Tool für die Zusammenarbeit in der Gemeinschaft, und ich habe 4 verschiedene Berechtigungen:

  • Ersteller - Änderungen vornehmen, Änderungen annehmen, Berechtigungen ändern
  • Änderungen akzeptieren
  • Änderungen vornehmen
  • Siehe

Wie könnte ich diese Art von Berechtigungssystem für Benutzergruppen in einer Datenbank implementieren?

Bearbeiten: Gruppen/Berechtigungen werden durch Reputation definiert, wie bei StackOverflow.

Edit 2 - ausführlicher: Jede Datei muss eine Berechtigung haben, Projekte brauchen Standardberechtigungen für neu erstellte Dateien, und ich muss auch MySQL-Datenbankberechtigungen einrichten.

60voto

dqhendricks Punkte 17711
user_table
id, etc

permission table
id, user_id, permission_type

Mit dieser Struktur könnte jeder Benutzer mehrere Berechtigungstypen mit seinem Konto verknüpfen, einen für jeden Satz von Funktionen, die er könnte Sie brauchen die Tabellenstruktur nicht zu ändern, um neue Arten von Berechtigungen hinzuzufügen.

Um noch einen Schritt weiter zu gehen, könnte man jede Art von Berechtigung zu einer Binärzahl machen. Auf diese Weise könnte man einen Satz von Berechtigungen durch eine Ganzzahl darstellen, indem man bitweise Operatoren verwendet.

Wenn Sie zum Beispiel die Konstanten

PERMISSION_CHANGE_PERMISSIONS = bindec('001') = 1
PERMISSION_MAKE_CHANGES = bindec('010') = 2
PERMISSION_ACCEPT_CHANGES = bindec('100') = 4

können Sie diese Werte mit dem bitweisen Operator "|" zu einer Ganzzahl kombinieren

(PERMISSION_CHANGE_PERMISSIONS | PERMISSION_MAKE_CHANGES) = bindec('011') = 3 = $users_combined_permissions

um dann zu prüfen, ob sie eine bestimmte Erlaubnis haben, verwenden Sie den bitweisen Operator "&".

($users_combined_permissions & PERMISSION_MAKE_CHANGES) = true

Wenn Sie das tun, brauchen Sie nur einen Datensatz für jede Gruppe von Berechtigungen.

3voto

stefgosselin Punkte 8802

Ich habe verwendet Zend_Acl in der Vergangenheit für diesen Zweck. Ich kann es empfehlen. Eine erprobte und getestete Bibliothek, die recht einfach zu implementieren ist und eigenständig verwendet werden kann. Diese Option lässt sich gut skalieren, wenn Sie später verschiedene Berechtigungsschemata hinzufügen möchten.

0voto

Flipper Punkte 2591

Ich würde zwei Tabellen erstellen: Benutzer und Ränge.

User
-----
id
username
rankID

Ranks
------
id
makeChanges
acceptChanges
changePermissions
view

Erstellen Sie dann einfach die verschiedenen Ränge, die Sie in der Tabelle "Ranks" haben möchten, und stellen Sie die "RankID" der Benutzer so ein, dass sie mit dem entsprechenden Rang übereinstimmt, den Sie haben möchten. Stellen Sie sicher, dass Sie in der Tabelle "Ranks" jedes Feld auf den Wert 0 oder 1 setzen, wobei 0 bedeutet, dass Sie diese Fähigkeit nicht haben und 1, dass Sie diese Option haben.

bearbeiten Wenn Sie dies ohne eine Datenbank tun würden, könnten Sie es mit den Klassen oder sogar Instanzen in PHP5 tun. Nehmen wir zum Beispiel an, Sie hätten für jedes der Dinge, die Sie in Ihrem ursprünglichen Beitrag genannt haben, einen Namen festgelegt:

Creator - make changes, accept changes, change permissions
Reviewer - Accept changes
Editor - Make changes
Regular - View

Dann könnten Sie etwas wie folgt tun

class Regular
{
    public function View()
    {
        //Do the view stuff in here
    }
}

class Editor extends Regular implements Edit
{

}

class Reviewer extends Regular implements Review
{

}

interface Review
{
    public function AcceptChanges()
    {
        //Do the accept changes here
    }
}

interface Edit
{
    public function MakeChanges()
    {
        //Do the make changes stuff here
    }
}

class Creator extends Regular implements Edit, Review
{
    public function ChangePermissions()
    {
        //Do the change permissions stuff here
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X