Guten Abend!
Ich habe das komplette System nochmals überarbeitet und optimiert. leider funktioniert das gnaze noch nicht wirklich und daher möchte ich euch zunächst das neue System vorstellen und euch dann um Hilfe bitten.
Wie schon zuvor soll es zwei Tabellen, eine für die User-Daten und eine für die Daten der "privaten" Bereiche geben. Die User-Tabelle enthält also im einfachsten Fall
id |
name |
password |
permissions. Die Tabelle für die "priavten" oder einfacher gesagt, für die geschützten Bereiche, enthält allerdings nun nur noch den
Namen des Bereichs und eine zugehörige
ID.
Wie findet man allerdings nun mit dem binären Wert aus der Permissions-Spalte der User Tabelle heraus, ob ein Benutzer zugriff auf einen bestimmten Bereich hat oder nicht? Oder auf welche Bereiche er überhaupt zugriff hat? Die Lösung ist eigentlich einfach. Nimmt man die ID für einen bestimmten bereich in zum Beispiel einem CM-System und nutzt diesen als Exponent zur Basis zwei, so erhält man den binären Wert, den der User als Teil seines binären Wertes besitzen muss.
Möchte man nun also alle IDs der Bereiche herausfinden, zu denen ein User Zugriff besitz, kann man dies relativ einfach auszählen. Ein Beispiel:
Es gibt die Bereiche
bla(
ID 1),
lol(
ID 2),
omg(
ID 3) und
nop(
ID 4).
Möchte nun jemand zum Beispiel den benötigten Binärwert zu
bla wissen, muss er nur 2^ID(lol) = 2^2 = 4 rechnen.
Möchte man also alle Bereiche wissen, zu denen ein Benutzer Zugriff besitzt, muss man einfach nur nach dem größten möglichen Exponenten zur Basis zwei suchen, bei dessen Subtraktion vom binären Permissions-Wert des Users nicht null herauskommt. Man durchläuft also eine Schleife solange, bis kein Restwert der Permissions mehr da ist. Gibt es also einen Nutzer
Klaus mit dem binären Permissions-Wert
20 in meinem oben begonnenen pseudo CM-System, so setzen sich seine Werte wie folgt zusammen.
P(
Klaus) = 2^
ID(
nop) + 2^
ID(
lol)
Der Benutzer Klaus hat also Zugriff auf die Bereiche nop und lol.
In PHP kann man dies, wie schon gesagt mit einer Schleife leicht errechnen.
PHP:
// permissions of Klaus
$perms = 20;
//start counter
$i = 0;
// initiate array of ids
$mods = array();
// extrahate specific permissions
do
{
if( (($p-pow(2,$i)) < 0) )
{
$e = $i-1;
$p = $p-pow(2,$e);
$mods[] = $e;
$i = 0;
}
else
{
$i++;
}
}
while( (($p-pow(2,$i)) < 0) && ($p > 0) )
Nach Durchlaufen der Schleife enthält das Array
$mods alle IDs zu den geschützten bereichen zu denen Klaus Zutritt besitzt, also 2 und 4.
Ich hoffe, dass das neue System klar geworden ist. Bei Fragen stehe ich natürlich gerne zur Verfügung und für Anregungen bin ich auch immer offen.
Doch, wie schon gesagt, funktioniert die umgeschriebene Klasse noch nicht ganz. Es tritt folgender Fehler auf und ich finde ihn einfach nicht, wodurch ich die Klasse auch noch nicht testen konnte.
Code:
Parse error: syntax error, unexpected T_RETURN, expecting ';' in /home/www/web193/html/permissions.php on line 180
Ich hoffe mir kann jemand helfen. Ich wäre sehr dankbar. Die betreffende Zeile ist übrigens die mit der
while()-Schleife in der
getPerms()-Methode.
MfG, Andy
Übersicht über die Methoden
__construct() - Setzt die wichtigen Variablen
addMod() - Fügt einen geschützten Bereich hinzu
delMod() - Entfernt einen geschützten Bereich
getMods() - Gibt die IDs aller geschützter bereiche zurück
getPerms() - Gibt die IDs zu den Bereichen zu denen ein Benutzer Zutritt besitzt zurück
addUser() - Fügt einen Benutzer hinzu
check() - Überprüft die Zutritts-Berechtigung eines Nutzers
getId() - Gibt die ID zu einem Bereich oder einem Nutzer anhand der ID oder des Namens zurück