Forum gesperrt  Dieses Thema ist gesperrt. Du kannst keine Beiträge editieren oder weitere Antworten erstellen.  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Rechtesystem von Adminmod
BeitragVerfasst: 30.03.2004, 20:56 
Benutzeravatar

Registriert: 02.05.2003, 16:21
Beiträge: 378
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?


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 30.03.2004, 21:30 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
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


Zuletzt geändert von Rinde am 30.03.2004, 21:43, insgesamt 1-mal geändert.

Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 30.03.2004, 21:33 
AM.de Team
Benutzeravatar

Registriert: 23.11.2001, 00:00
Beiträge: 3842
Wohnort: Vor König Arthus
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ß... ;)

_________________
Der schwarze Ritter triumphiert immer...
WING-Clan


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 30.03.2004, 21:44 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
l0gen, was denkst du denn?


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 31.03.2004, 15:55 
Benutzeravatar

Registriert: 02.05.2003, 16:21
Beiträge: 378
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!";


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 01.04.2004, 20:09 
Benutzeravatar

Registriert: 02.05.2003, 16:21
Beiträge: 378
lol? Wenn ich die Zahlen vor der if-Abfrage net in Binär konvertiere, dann funzt es! Versteh ich net aber solange es funzt ;)


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 01.04.2004, 20:20 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
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 :)


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Forum gesperrt  Dieses Thema ist gesperrt. Du kannst keine Beiträge editieren oder weitere Antworten erstellen.  [ 7 Beiträge ] 


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de
Original Design von "[ Half-Life Admin Mod © Alfred Reynolds 2000-2003 ] - [ site design by Jägermeister ]"