B
Bgag
Guten Abend!
Ich stehe mal wieder vor einem größeren Problem. Jeder kennt ihn, den Stress mit der Benutzerverwaltung und dem damit verbundenen Rechtesystem. Früher habe ich einfach in der User-Tabelle eine Spalte rights gehabt, in der durch Komma getrennt die Bereiche standen, die der User betreten darf. Leider ist diese Variante sehr Performance fressend und erfordert eine weitere Tabelle in der alle verfügbaren Bereiche des internen Bereichs stehen, um die Rechte auch ändern zu können. Daher bin ich sehr schnell auf die Variante umgestiegen, bei der in einer Tabelle einerseits das Recht, dass der User besitzt und der jeweilige User stehen. Das heißt für jeden User mehrere Einträge in dieser Tabelle, es sei denn er besitzt überhaupt keine. Aber auch diese Variante scheint mir nicht die optimalste zu sein.
Da fiel mir das UNIX- oder auch Datei-Rechtesystem (chmod) ein. Beide bauen auf dem binären Zahlensystem auf. Die möglichen Rechte beim Zugriff auf Dateien sind euch vermutlich bekannt. Lesen, Schreiben und Ausführen (die Unterscheidung in Besitzer, Gruppen und Öffentliche Berechtigungen lassen wir außer Acht). Diesen drei Rechten wurden Zweierpotenzen zugewiesen.
Ausführen => 1 (2^0)
Schreiben => 2 (2^1)
Lesen => 4 (2^2)
Durch addieren der einzelnen Rechte kann man alle Rechte eines Users auf eine Zahl zusammenführen. Administratoren dürfen ja bekanntlich alles (=1+2+4=7) wohingegen andere User zum Beispiel nur Lesen und Schreiben dürfen (=2+4=6). Das besondere an einem binären Rechtesystem ist nun, dass man aus dieser Zahl (anders als beim Dezimalsystem) wieder alle Rechte extrahieren kann. Dies wird klarer wenn man die drei Zahlen für Lesen, Schreiben und Ausführen ins Binärsystem (Zählung von rechts) übersetzt.
Ausführen => 001
Schreiben => 010
Lesen => 100
Der Administrator besitzt also die rechte 111 und der vorhin erwähnte User 110.
Ein auf dieser Idee aufbauendes Rechtesystem wäre sehr Performance freundlich und würde nur zwei Tabellen erfordern. Die User-Tabelle mit einer Spalte permissions oder perms (Rechte) und einer Tabelle permissions, die alle geschützten Bereiche und das jeweils benötigte Recht (eine Zweierpotenz) beinhaltet. PHP bietet uns auch schon durch die binären Operatoren eine wundervolle Möglichkeit zur Überprüfung, ob ein Benutzer die nötigen Rechte besitzt. Es ist nämlich möglich über das &-Zeichen eine binäre UND-Verknüpfung zu schaffen. Mit Hilfe dieser Operation kann man zum Beispiel nun feststellen, ob an der dritten Stelle (Zählung von rechts) der binären Zahl, die die Rechte eines Users vereint, eine Eins steht, die dem User im obigen Beispiel das Lesen erlauben würde.
Man könnte zum Beispiel wie folgt überprüfen, ob ein User die benötigten Rechte für einen Bereich haben:
Dank dem &-Operator von PHP geht es allerdings auch einfacher:
Genug aber der Theorie. Da ich nun in mehreren neueren Projekten ein ausreichendes Rechtesystem benötige. Habe ich begonnen eine Klasse zu schreiben, die mir die Verwendung eines binären Rechtesystems ermöglicht bzw. erleichtert.
Leider gibt es noch einige Probleme, bei denen ich noch nicht so richtig weiter komme.
Die Methode addPerm(), mit deren Hilfe man neue geschützte Bereiche hinzufügen können soll, funktioniert leider nicht so richtig. Das SQL-Query ist wohl fehlerhaft und ich kann leider nicht sagen, wo da mein Fehler liegt. Kann mir da jemand helfen?
Außerdem scheinen mir noch einige andere Queries wie bei userPerm() und getPerms() noch zu kompliziert zu sein. Kennt jemand eine Möglichkeit der Vereinfachung?
Des weiteren würde ich in den Methoden getPerm() und delPerm() gern optional entweder den Namen oder die Id der Section übergeben lassen. Hat jemand einen Vorschlag, wie ich das am besten lösen könnte?
Zu guter Letzt möchte ich noch die Methoden editUser() und addUser() hinzufügen, die beide die Parameter $fields und $values (beides Arrays) übergeben bekommen sollen. Natürlich wird bei editUser() zusätzlich noch die User-Id mit übergeben. Mein Problem ist allerdings, wie ich bei editUser() diese beiden Arrays richtig in das Query einbinde, damit die Datenbank es auch annimmt. Vielleicht kann mir auch dabei jemand helfen.
Ich wäre euch sehr dankbar, wenn ihr mir den ein oder anderen Tipp oder weitere Anregungen geben könntet. Wäre auch sehr nett, wenn jemand mal über meine Queries schauen könnte. Mysql ist leider ein bisschen mein Stiefkind. Ich beantworte natürlich auch gerne noch weitere Fragen, wenn meine vorhergehende Beschreibungen meines Vorhabens bzw. meines Problems oder eher meiner Probleme nicht ausreichend waren.
MfG, Andy
Ich stehe mal wieder vor einem größeren Problem. Jeder kennt ihn, den Stress mit der Benutzerverwaltung und dem damit verbundenen Rechtesystem. Früher habe ich einfach in der User-Tabelle eine Spalte rights gehabt, in der durch Komma getrennt die Bereiche standen, die der User betreten darf. Leider ist diese Variante sehr Performance fressend und erfordert eine weitere Tabelle in der alle verfügbaren Bereiche des internen Bereichs stehen, um die Rechte auch ändern zu können. Daher bin ich sehr schnell auf die Variante umgestiegen, bei der in einer Tabelle einerseits das Recht, dass der User besitzt und der jeweilige User stehen. Das heißt für jeden User mehrere Einträge in dieser Tabelle, es sei denn er besitzt überhaupt keine. Aber auch diese Variante scheint mir nicht die optimalste zu sein.
Da fiel mir das UNIX- oder auch Datei-Rechtesystem (chmod) ein. Beide bauen auf dem binären Zahlensystem auf. Die möglichen Rechte beim Zugriff auf Dateien sind euch vermutlich bekannt. Lesen, Schreiben und Ausführen (die Unterscheidung in Besitzer, Gruppen und Öffentliche Berechtigungen lassen wir außer Acht). Diesen drei Rechten wurden Zweierpotenzen zugewiesen.
Ausführen => 1 (2^0)
Schreiben => 2 (2^1)
Lesen => 4 (2^2)
Durch addieren der einzelnen Rechte kann man alle Rechte eines Users auf eine Zahl zusammenführen. Administratoren dürfen ja bekanntlich alles (=1+2+4=7) wohingegen andere User zum Beispiel nur Lesen und Schreiben dürfen (=2+4=6). Das besondere an einem binären Rechtesystem ist nun, dass man aus dieser Zahl (anders als beim Dezimalsystem) wieder alle Rechte extrahieren kann. Dies wird klarer wenn man die drei Zahlen für Lesen, Schreiben und Ausführen ins Binärsystem (Zählung von rechts) übersetzt.
Ausführen => 001
Schreiben => 010
Lesen => 100
Der Administrator besitzt also die rechte 111 und der vorhin erwähnte User 110.
Ein auf dieser Idee aufbauendes Rechtesystem wäre sehr Performance freundlich und würde nur zwei Tabellen erfordern. Die User-Tabelle mit einer Spalte permissions oder perms (Rechte) und einer Tabelle permissions, die alle geschützten Bereiche und das jeweils benötigte Recht (eine Zweierpotenz) beinhaltet. PHP bietet uns auch schon durch die binären Operatoren eine wundervolle Möglichkeit zur Überprüfung, ob ein Benutzer die nötigen Rechte besitzt. Es ist nämlich möglich über das &-Zeichen eine binäre UND-Verknüpfung zu schaffen. Mit Hilfe dieser Operation kann man zum Beispiel nun feststellen, ob an der dritten Stelle (Zählung von rechts) der binären Zahl, die die Rechte eines Users vereint, eine Eins steht, die dem User im obigen Beispiel das Lesen erlauben würde.
Man könnte zum Beispiel wie folgt überprüfen, ob ein User die benötigten Rechte für einen Bereich haben:
PHP:
// permissions from database
$perm = 6;
if($perm >= 6)
{
// writing allowed
}
if($perm == 1 || $perm == 3 || $perm == 7)
{
// allowed to take orders
}
PHP:
if(($perm & 2) == 2)
{
// writing allowed
}
if(($perm & 4) == 4)
{
// reading allowed
}
Leider gibt es noch einige Probleme, bei denen ich noch nicht so richtig weiter komme.
Die Methode addPerm(), mit deren Hilfe man neue geschützte Bereiche hinzufügen können soll, funktioniert leider nicht so richtig. Das SQL-Query ist wohl fehlerhaft und ich kann leider nicht sagen, wo da mein Fehler liegt. Kann mir da jemand helfen?
Außerdem scheinen mir noch einige andere Queries wie bei userPerm() und getPerms() noch zu kompliziert zu sein. Kennt jemand eine Möglichkeit der Vereinfachung?
Des weiteren würde ich in den Methoden getPerm() und delPerm() gern optional entweder den Namen oder die Id der Section übergeben lassen. Hat jemand einen Vorschlag, wie ich das am besten lösen könnte?
Zu guter Letzt möchte ich noch die Methoden editUser() und addUser() hinzufügen, die beide die Parameter $fields und $values (beides Arrays) übergeben bekommen sollen. Natürlich wird bei editUser() zusätzlich noch die User-Id mit übergeben. Mein Problem ist allerdings, wie ich bei editUser() diese beiden Arrays richtig in das Query einbinde, damit die Datenbank es auch annimmt. Vielleicht kann mir auch dabei jemand helfen.
Ich wäre euch sehr dankbar, wenn ihr mir den ein oder anderen Tipp oder weitere Anregungen geben könntet. Wäre auch sehr nett, wenn jemand mal über meine Queries schauen könnte. Mysql ist leider ein bisschen mein Stiefkind. Ich beantworte natürlich auch gerne noch weitere Fragen, wenn meine vorhergehende Beschreibungen meines Vorhabens bzw. meines Problems oder eher meiner Probleme nicht ausreichend waren.
MfG, Andy
Zuletzt bearbeitet von einem Moderator: