tutorials.de Buch-Aktion 05/2012
  • Rechtesystem mit verschiedenen Benutzergruppen

    Herzlich Willkommen zu meinem Tutorial "Rechteverteilung verschiedener Benutzergruppen"

    Sei es nun für einen Webservice, eine Internetseite oder eine Desktop-Anwendung, wir benutzen eine Datenbank um unsere Benutzerdaten zur späteren Identifizierung zu speichern. Natürlich könnte man jedem Benutzer eine natürliche Zahl für die entsprechende Gruppe zuweisen, aber das wäre sehr undynamisch, da es keine Mehrfachverteilungen geben
    könnte.

    Um nun diesem Problem Herr zu werden, benutzen wir eine sogenannte Bitmaske.
    Es folgt ein kleiner Exkurs in die Welt der Bitoperatoren:
    Die Zahlen von 0-256 können in einem Byte gespeichert werden, welches widerum aus 8 Bit besteht.

    0000 0000 -> 0
    0000 0001 -> 1
    0000 0010 -> 2
    0000 0011 -> 3
    .
    ..
    ...
    Dabei repräsentieren die einzelnen Bits von rechts die Dualzahlen

    2^8 2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0
    | | | | | | | | |
    0 0 0 0 0 0 0 0 1 = 1

    Wir können nun einzelne Bits setzen, vergleichen und wieder entfernen.


    0000 0100 (4) or
    0000 0001 (1)
    ----------------
    0000 0101 (5)

    Wie man hier sieht, haben wir 2 Zahlen mit dem Bitoperator or verknüpft und somit das erste Bit (2^0) gesetzt.
    Alle anderen Bits bleiben so wie gehabt.

    0000 0101 (5) and
    0000 0100 (4)
    --------------------
    0000 0100 (4)

    Wollen wir nun prüfen, ob ein bestimmtes Bit gesetzt ist, verknüpfen wir unsere Zahl mit der Bitfolge, welche das
    gesetzte Bit enthällt. Wenn wieder unsere Prüfbitfolge rauskommt, ist das Bit gesetzt.

    0000 0101 (5) xor
    0000 0100 (4)
    --------------------
    0000 0001 (1)

    Mit xor können wir bestimmte Bits nun entfernen.

    Wieso, weshalb, warum unsere Bitoperatoren diesen Effekt hervorrufen, könnt ihr in Büchern zur Aussagenlogik nachlesen.

    Um nun aber wieder zu unserem Problem zurückzukommen, benötigen wir nun, wie ihr euch sicherlich schon denken könnt,
    nur noch eine Bytezahl, um verschiedene Rechte zu vergeben.
    Es folgt ein kleines Beispiel:

    Nehmen wir ein Redaktionssystem, wo verschiedene Benutzer, News schreiben, bearbeiten und löschen können und wo es
    einen Admin gibt, der alles darf.
    Vergeben wir nun erstmal unsere Rechte:
    Dafür deklarieren wir uns am besten Konstanten, welche wir mit unseren Bitfolgen füllen.

    cKeinRecht -> 0000 0000 -> Zahl 0 -> Keine Rechte
    cNewsSchreiben -> 0000 0001 -> Zahl 1 -> News schreiben
    cNewsBearbeiten -> 0000 0010 -> Zahl 2 -> News bearbeiten
    cNewsLoeschen -> 0000 0100 -> Zahl 4 -> News löschen
    cAdmin ->0000 0111 -> Zahl 7 -> Admin (darf alles)

    Wenn sich nun ein neuer Benutzer in unserem Redaktionssystem anmeldet, darf er erstmal nur News schreiben.
    Unser Benutzer bekommt zum Anfang in unserer Datenbank eine 1, welche repräsentiert, dass News schreiben darf.

    Wollen wir nun prüfen, ob er das auch wirklich darf, geht das folgender Weise:

    Code :
    1
    2
    
    if(BenutzerRecht and cNewsSchreiben) = cNewsSchreiben then
      // Wenn dieser Vergleich stimmt, hat er das nötige Recht um News schreiben zu dürfen

    Hat sich der Benutzer bewährt und er darf absofort auch News bearbeiten, geben wir ihm die nötigen Rechte

    Code :
    1
    
    BenutzerRecht = BenutzerRecht or cNewsBearbeiten

    Absofort darf er auch News bearbeiten. Um ein Recht wieder zu löschen, wenden wir den xor Operator an.

    In einem Byte können wir also 8 verschiedene Rechte speichern. Sollten wir mehr Rechte benötigen, brauchen wir
    einen größeren Datentypen, das Prinzip bleibt aber das gleiche.

    Ich hoffe, das Tutorial hat euch gefallen und ihr werdet euren Nutzen daraus ziehen.

    Danksagungen und Lobpreisungen wie immer per PN

    Caminus
     


    Kommentare Kommentar schreiben

    Klicke hier, um dich anzumelden

    Welche Farbe hat eine reife Zitrone?