bitweise überprüfen (Rechteverwaltung)

  • Themenstarter Themenstarter TiMbO2k
  • Beginndatum Beginndatum
T

TiMbO2k

Hi,

ich habe eine Rechteverwaltung, bei der für jede Funktion eine Zahl definiert wird. Diese Zahl wird bei jeder neuer Funktion verdoppelt.

Also zum Beispiel:

News posten - 1
News editieren - 2
News löschen -4
Kommentare posten - 8
Kommentare löschen - 16

usw.

Je nachdem welche Berechtigung der User hat, werden die Zahlen der jew. Funktionen addiert. Wenn ein User zum Beispiel nur News und Kommentare posten darf, dann ist seine Berechtigung: 9 (1+8).

Anhand des & Operators kann man nun prüßen, ob die Zahl der Funktion in der Berechtigung in Bits gesetzt ist.

Zum Beispiel beim Überprüfen ob der User mit der Berechtigung 9, News posten darf:

if(9 & 1) { echo "ok"; } else { echo "verweigert"; }

Die Verfahrensweise funktioniert bei mir einwandfrei. Mittlwerweile bin ich bei 31 Funktionen angekommen und ab der 32. Funktion funktioniert das Sytem leider nicht mehr :(.

Um das zu veranschaulichen habe ich folgendes Script erstellt:

PHP:
$temp = 1;
for($i=1; $i<=35; $i++)
    {
    $wert = $temp = $temp*2;
    $summe = $summe+$wert;
    }

    $berechtigung = $summe+1;
    echo "<p>Berechtigung: ".$berechtigung."<p>";

$temp = 1;
for($i=1; $i<=35; $i++)
    {
    $wert = $temp = $temp*2;
    echo $i." : ".$wert." : ";
    if($berechtigung & $wert) { echo "ok<br>"; } else { echo "error<br>"; }
    }

Vielleicht kann mir einer sagen, wieso es aber der 32. Funktion nicht mehr geht. Wenn es eine Lösung gibt, wäre ich auch sehr dankbar.

MfG

TiMbO2k
 
ok, Grundlagen Informatik:

ein Integer (in C bzw. PHP) ist genau 32 Bit gross, wovon das führende Bit jedoch als Vorzeichen-Bit verwandt wird. demzufolge stehen für den reinen Zahlenwert genau 31 Bit zur Verfügung. und damit genau 31 "Funktionen".

Um das also zu erweitern, kannst du als 32. Funktion die Zahl einfach negativ bzw. positiv machen und dies dann abfragen und ab der 33. benutzt du dann einen weiteren Integer.

hth, Jaeger
 
ich bevorzuge Zeichenketten als Rechte-Managment (wie Clan-Mod)
z.B:
N - news posten
P - Poll posten
etc.
dann brauchste bloß:
PHP:
$rights = "N";
if (strstr($rights,"N"))
 {
  echo "klappt !";
 }
verbraucht weniger platz und du hast ohne sonderzeichen 58 mögliche funktionen zur verfügung (buchstaben klein+groß & ziffern)

Ist halt nur meiner Meinung nach einfacher, vor allen Dingen bei der Abfrage ...
 
Hmm stimmt wäre eine gute Alternative.

Mit fehlt jetzt allerdings die Zeit, alle 31 Funktionen umzuschreiben und die ganze Rechteverwaltung umzustrukturieren. Deshalt werde ich einfach einen 2. Integer hinzufügen und wie bissher fortfahren.

Trotzdem Danke für den Hinweis !!!
 
Zurück