AdminMod.de
https://www.adminmod.de/

Rechtesystem von Adminmod
https://www.adminmod.de/viewtopic.php?t=8465
Seite 1 von 1

Autor:  Thunderbolt [ 30.03.2004, 20:56 ]
Betreff des Beitrags:  Rechtesystem von Adminmod

Schreib grad ein PHP-Script wo verschiedene User bestimmte Rechte haben können oder eben nicht, jetzt suche ich nach einem System um das ganze zu verwalten und da is mir das Rechtesystem von Adminmod eingefallen, das das ja eigentlich ganz nett verarbeitet. Aber wie wird das ganze im Programm dann gehandhabt? Wenn jemand Rechtelevel 126975 hat, wie dröselt AM das dann wieder auf, um zu wissen welche einzelnen Rechte das jetzt sind?

Autor:  Rinde [ 30.03.2004, 21:30 ]
Betreff des Beitrags: 

die rechte werden in einem integer gespeichert, der die bitsumme der einzelnen rechte darstellt. jedes recht ist darum eine potenz von 2.
in binärschreibweise ergibt sich der zusammenhang sehr anschaulich
der volle zugriff auf adminmod wird durch die rechte 131071 gewährt, was den ersten 17 bits enspricht
11111111111111111
man sieht, das alle diese rechte "wahr" sind.

wenn meinetwegen das recht 16384 (reserved nickname) nicht gegeben werden soll, wird das entsprechende bit entfernt. 16384 ist in binärschreibweise ein einzelnes bit, nämlich das fünfzehnte:
100000000000000
was im dezimalsystem 114687 entspricht

die resultierenden rechte sind in binär
11011111111111111

über bitoperatoren können rechte gesetzt, entfernt und geprüft werden.

(dieser syntax ist in PHP bis auf die variablendeklaration verwendbar)
Code:
unsigned int rechte;
rechte |= (1<<0); // Recht 1 setzen
rechte |= (1<<5); // Recht 6 setzen

rechte &= ~(1<<0); // Recht 1 wieder entfernen

if(rechte & (1<<0)) { // überprüfen, ob recht 1 gesetzt ist
   // dies wird nicht ausgeführt
}
if(rechte & (1<<5)) { // überprüfen auf recht 6
   // dies wird ausgeführt
}
die verwendeten bitoperatoren sind:

<<: left bit shift - verschiebt die bits des ersten operanden um die größe des zweiten operanden nach links. da hier nur 1 als erster operand benutzt wird, was einem einzelnen bit entspricht, wird im ergebnis auch jeweils nur ein bit gesetzt sein. dieser operator eigent sich also gut, die einzelnen rechte zu "erzeugen". zum einfacheren lesen können konstanten mit diesen werten verwendet werden.

|: Bitweises oder - im ergebnis sind alle bits gesetzt, die in einem der beiden operanden gesetzt sind
|=: dem ersten operanden werden alle bits des zweiten operanden hinzugefügt
&: Bitweises und - im ergebnis sind alle bits gesetzt, die in beiden operatoren gesetzt sind
&=: dem ersten operanden werden alle bits entfernt, die nicht im zweiten operanden auch gesetzt sind
~: bitweise negation - das ergebnis ist das 1-komplement des operanden, also die umkehrung aller bits (alle 1 werden zu 0 und umgekehrt)


das ist alles nicht ganz einfach zu verstehen wenn man sich das erste mal damit beschäftigt, ich hoffe aber ich konnte trotzdem helfen

Autor:  [WING] Black Knight [ 30.03.2004, 21:33 ]
Betreff des Beitrags: 

Die Berechnung läuft nach dem Muster:
Code:
a*2^0+b*2^1+c*2^2+...
a, b, c,... etc. können die Werte 0 und 1 annehmen.

In PHP ausgedrückt, macht es Sinn die Zahl im binären System darzustellen, bindec(). Im binären System sind die Faktoren a,b,c usw. für die Darstellung verantworlich.

Beispiel:

Rechtelevel 77569
Im Binärsystem ergibt das: 10010111100000001
Darüber kannst Du jetzt die einzelnen Rechte direkt auslesen.

Die entsprechenden Funktionen für PHP sind bindec() und decbin(). Du ersparst Dir also eine Menge Programmierarbeit. Das hat schon jemand für Dich übernommen. :)


PS.: War ja klar, dass Rinde sich das Thema nicht nehmen ließ... ;)

Autor:  Rinde [ 30.03.2004, 21:44 ]
Betreff des Beitrags: 

l0gen, was denkst du denn?

Autor:  Thunderbolt [ 31.03.2004, 15:55 ]
Betreff des Beitrags: 

jo thx!
Den Ansatz und die Operatoren hab ich verstanden, für die Umsetzung find ich bestimmt auch noch nen Weg ;)

--EDIT--

Hmm ist hier ein Fehler oder hab ichs nur net verstanden? Das Bitweise und, setzt doch bei den Zahlen im Beispiel:

100110
000110
---------
000110

da Bit "4" und "2" in beiden gesetzt sind aber ich bekomm immer 100 was bei der if-Abfrage natürlich zum FALSE führt
Code:
$recht = 38;
$benötigt = 6;
$recht = decbin($recht);
$benötigt = decbin($benötigt);

if(($recht & $benötigt) == $benötigt) echo "TRUE!";
else echo "FALSE!";

Autor:  Thunderbolt [ 01.04.2004, 20:09 ]
Betreff des Beitrags: 

lol? Wenn ich die Zahlen vor der if-Abfrage net in Binär konvertiere, dann funzt es! Versteh ich net aber solange es funzt ;)

Autor:  Rinde [ 01.04.2004, 20:20 ]
Betreff des Beitrags: 

intern werden die zahlen ohnehin in binär bearbeitet. die binäroperatoren sind sogar nur für solche geeignet
die "binärzahlen" die dectobin in PHP liefern sind in wirklichkeit strings. und wenn du integer-operatoren wie & auf strings anwendest in einer scriptsprache wie PHP, werden diese in ints umgerechnet. dann hast du die zahlen 100110 und 000110 im dezimalsystem, und darauf werden die binäroperatoren angewendet. da kann dann natürlich nichts bei rauskommen :)

Seite 1 von 1 Alle Zeiten sind UTC+01:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/