Frage

Ich habe angefangen, eine Forum-Anwendung in PHP auf meinem MVC-Framework zu entwickeln, und ich habe auf die Bühne, wo ich assign Berechtigungen für Mitglieder. (Zum Beispiel: READ, WRITE, UPDATE, DELETE)

Nun, ich weiß, dass ich 5 Spalten unter der Benutzertabelle in der Datenbank hinzufügen und setzen Sie sich auf 1 | 0, aber das ist für mich wie zu viel scheint, wenn ich will andere Regeln hinzufügen, wie MOVE zum Beispiel.

Und wie kann ich zuweisen dynamisch diese Privilegien sie Benutzer individuell?

Ich habe gehört, ein Bitmasken zu verwenden, aber es wäre wirklich gut, wenn ich sie voll und ganz verstehen konnte, bevor ich weiter.

Haben Sie ein Beispiel, wie ich das umsetzen könnte?

War es hilfreich?

Lösung

Die Methode, die Sie beschrieben - einzelne in Spalten gespeichert Privilegien -. Unkompliziert auf Kosten der Flexibilität (wie Sie vielleicht bemerkt)

Zuul Methode ist noch einfacher und im Wesentlichen das gleiche wie Sie, außer es die Notwendigkeit für „ALTER TABLE“ Aussagen vermeidet. Es ist jedoch nicht normalisiert, nicht leicht abfragbare und nicht selbsterklärend.

Ein weiteres Problem bei diesen beiden Verfahren ist, dass als Benutzerbasis wächst, können Sie es immer mehr Schmerz finden alle Privilegien richtig eingestellt zu halten. Sie werden sich mit einer Menge von Benutzern, die die gleichen Privilegien genau benötigen. Doch um die Berechtigungen eines Benutzers zu ändern, wie ein neues Privileg zu empfangen, werden Sie in gehen und fügen Sie dieses Privileg für jeden Benutzer, die es einzeln muss. Major PITA.

Für ein Forum, ist es nicht wahrscheinlich, dass Sie die Rechteverwaltung pro Benutzer benötigen. Wahrscheinlicher werden Sie bestimmte Klassen von Benutzern wie anonyme Benutzer, angemeldete Benutzer, Moderatoren, Administratoren, usw. für die Zugangskontrolle rollenbasierte Dies würde es gut geeignet machen (RBAC). In diesem System würden Sie jeden Benutzer eine Rolle zuweisen, und gewähren Privilegien der Rolle. Privilegien würden als Zeilen in einer „Privileg“ Tabelle gespeichert. so das vereinfachte Datenbankschema aussehen würde:

PRIVILEGE
int id (primary key)
varchar description

ROLE_PRIVILEGE_JOIN
privilege_id (foreign key)
role_id (foreign key)

ROLE
int id (primary key)
varchar description

USER
int id (primary key)
int role_id (foreign key)

Dieses Muster in vielen Anwendungen, die sich mit Benutzerrechten verwendet wird. In jedes Privileg, dass jemand möglicherweise als eine Zeile in der Tabelle Privileg haben könnte; jede Rolle hinzufügen, dass jeder Benutzer möglicherweise in der Rolle Tabelle haben könnte; und verknüpfen sie in geeigneter Weise in der role_privilege_join Tabelle.

Der einzige wirkliche Nachteil ist, dass da ein Join-Tabelle verwendet wird, die „kann Benutzer X tun Y“ Abfrage wird etwas langsamer sein.

Andere Tipps

Eine Berechtigung Bitmaske wird am besten verstanden, wenn sie als binär dargestellt, wobei jede Ziffer eine Erlaubnis darstellt, ein- oder ausgeschaltet ist. Also, wenn Berechtigungen X, Y und Z exist, und ich nur Zugriff auf X und Z, 101 würde bedeuten, dass ich die ersten und die dritten Berechtigungen mir gewährt haben, aber nicht die zweiten. Die binäre Zahl 101 entspricht der Dezimalzahl 5, so dass ist das, was in der Datenbank gespeichert enden würde. Eine einzelne, kleine ganze Zahl ist eine viel effizientere Objekt zu speichern, als ein String oder mehrere kleine ganze Zahlen sind.

EDIT: Ich habe erkannt, wie einfach es war zu Hebel Funktionen bestehenden Wandlungs- wird eine ziemlich schnelle Umsetzung zu erhalten. Hier ist ein Beispiel.

<?php
function bitmask_expand($n) {
  // 9 returns array(1, 0, 0, 1)
  return str_split(base_convert($n, 10, 2));
}

function bitmask_compact($a) {
  // array(1, 0, 0, 1) returns 9
  return (int) base_convert(implode($a), 2, 10);
}

$ns = range(0, 7);
foreach($ns as $n) {
  print_r($b = bitmask_expand($n));
  echo bitmask_compact($b), "\n\n";
}

Sie können eine bessere Leistung, wenn man Loops verwenden, anstatt zu und von Drahtzieher zurück, aber dies stellt das Prinzip ziemlich klar.

würde ich eine Tabelle namens "Rollen":

CREATE TABLE Roles(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY(id),
 rolename VARCHAR(30))

Stick was Berechtigungen, die Sie dort wollen. Dann erstellen Sie eine Tabelle namens „Userroles“ zu Link Benutzern Rollen:

CREATE TABLE UserRoles(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY(id),
 UserId INT,
 RoleID INT)

Viele Flexibilität und leicht zu bauen auf (dh Workflow, Regeln, etc.) (Ich würde auch Fremdschlüssel hinzufügen)

Sie brauchen das nicht zu komplizieren, verwenden Sie nur ein Feld „ab: Berechtigungen“ und so etwas wie:

$ permissions = "1; 1; 0; 1";

wo in Ihrem Interesse heißt es:

READ - 1 (können)

WRITE - 1 (can)

UPDATE - 0 (können)

DELETE - 1 (können)

dann, wenn die Überprüfung nur verwenden "explodieren" durch ";" ...

Auf diese Weise können Sie immer mehr Berechtigungen Typen anwenden, ohne den Tisch zu ändern ... so erhalten Sie Ihren Tisch kleine und Ihre Abfrage schneller!

Es ist eine Abhilfe für das Problem:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top