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



Kommentar schreiben

Bereiche
Kategorien
Forum - Programming





Artikel bewerten