#1 13. Mai 2007 Rechtesystem mit Binärzahlen Moin! Ich bin gerade dabei, ein cms zu schreiben. Dafür mache ich mir gerade Gedanken über die Rechteverteilung. Was schön wäre: Jedem User verschiedene Rechte geben können. So, dass user A also praktisch Newsartikel lesen und schreiben kann. User B kann dafür auch alle anderen bearbeiten und löschen und User C kann zusätzlich sogar noch Kommentare bearbeiten/löschen. Dafür wollte ich also für jede Aktion einen Zahlenwert zuweisen. Hab das schonmal so in der Art gesehen, jedoch blicke ich so genau nicht durch. Das ganze soll wohl mit Binärzahlen zu bewerkstelligen sein -> 1, 2, 4, 8, 16, 32, 64, 128, 256, 512... Wenn ich jetzt also zum News lesen den Wert 1 zuweise, zum schreiben 2, zum editieren 4 und zum löschen 8, müsste das alles addiert werden, wenn ein User das alles darf. Also hat User B jetzt den Rechtewert 15, wenn ich das jetzt richtig sehe. Frage: Wie kann ich jetzt "rausfiltern", welche Binärzahlen in der 15 drinstecken, um die Rechte rauszufinden? Außerdem kommt mir das etwas komisch vor. Wenn ich das ganze jetzt also für News, Gästebuch, Umfragen usw. mache, wird das doch nach gewisser Zeit total durcheinander. Da blickt ja dann niemand mehr durch. Und vor allem werden die Zahlen ja auch immer größer. Wie soll ich denn aus ner Zahl über 1000 nachher rausfinden, welche Binärzahlen da alle drinstecken? Für jede eine if-abfrage machen und das dann bei der größten anfangen, bis hin zur kleinsten? Wie müsste dann z.B. der code aussehen, um zu überprüfen, ob der user News löschen darf? Ich hoffe, ihr versteht, wie in etwa ich das meine. + Multi-Zitat Zitieren
#2 13. Mai 2007 AW: Rechtesystem mit Binärzahlen leg in der mysql extra fleder in der usertabelle an, is um ein vielfaches einfacher zu überschauen. zb: user_can_edit_news int(1) usw usw und auf deiner seite fetcht du einmal die ganzen felder und fragst so ab was der jenige user alles darf und was nicht. vorsugsweiße wurde ich 1 als "ja er darf" und 0 als "nein er darf nicht" setzen. + Multi-Zitat Zitieren
#3 13. Mai 2007 AW: Rechtesystem mit Binärzahlen du kannst z.B. erstmal decbin() auf deine zahl anwenden dann kannst du mit substr($rechte, -1, 1) z.B. die letzte 1 oder 0 rausfinden musst halt jeweils aus dem -1 eine -2, -3 usw. machen + Multi-Zitat Zitieren
#4 13. Mai 2007 AW: Rechtesystem mit Binärzahlen das system ist eigewntlich ganz einfach eine binärzahl sieht ja so aus: 10001 = 2^0 + 2^4 = 1 + 16 = 17 bzw bissl allgemeiner: jede stelle kannse du mittels 2^x erreichen dh wenn du die 2^x zahlen mit zwei untershciedlichen x addierst kannst du keine stelle überschreiben nun musst dir vorstellen jede stelle (aufbauend von hinten am besten) sthet jeweils für ein recht dh zb die hinterste zahl steht fürs schreiben von news: dh du nimmst deine zahl wandelst sie mittels einer php funktion in einene binary string um und guggst dir dann die entsprechenden stellen an (zur not irgendwie normieren dh vorne nullen einfügen o.ä.) hoffe hab dir geholfen + Multi-Zitat Zitieren
#5 14. Mai 2007 AW: Rechtesystem mit Binärzahlen wenn ihr mit einem binären rechtesystem arbeiten wollt, warum benutzt ihr nicht auch binäre arithmetik? murdoc, du bist doch mittlerweile auch n guter, du enttäuschst mich nach deiner methode hast du eine endlos groß werdende usertabelle, die sich irgendwann (man denke an verschiedene benutzergruppen und vielleicht mehrere bereiche außer news) stark auf die perfomance auswirkt. die anderen beiden vorschläge sind einfach mist ein user hat das level 13. wir wissen: 13 = 1+4+8. wollen wir rausfinden, ob der das recht 4 hat, verUNDen wir die beiden werte: 7 & 4 (logisches und) = true, denn Code: 13 = 001101 4 = 000100 analog dazu die verknüpfung mit 2: Code: 13 = 001101 2 = 000010 gibt false. irgendwelche additionen und potenzierungen, die hier oben stehen... wenn ich gefrühstückt hätte, würd mir was hochkommen. PHP: <? php // permission constants// could be queries from db $perm [ 0 ][ 0 ] = 0 ; $perm [ 0 ][ 1 ] = "News lesen" ; $perm [ 1 ][ 0 ] = 1 ; $perm [ 1 ][ 1 ] = "News schreiben" ; $perm [ 2 ][ 0 ] = 2 ; $perm [ 2 ][ 1 ] = "News löschen" ; $perm [ 3 ][ 0 ] = 4 ; $perm [ 3 ][ 1 ] = "Kopfstand machen" ; $perm [ 4 ][ 0 ] = 8 ; $perm [ 4 ][ 1 ] = "Finger in Po stecken" ; function getPerms ( $userlevel ) { global $perm ; for( $i = 0 ; $i < sizeof ( $perm ); $i ++) { echo "User darf " ; if(!( $userlevel & $perm [ $i ][ 0 ])) echo "keine(n) " ; echo $perm [ $i ][ 1 ]. "<br />\n" ; }} echo getPerms ( 4 ); + Multi-Zitat Zitieren
#6 14. Mai 2007 AW: Rechtesystem mit Binärzahlen Schön für dich dass dein Frühstück doch drinnen geblieben ist jedoch wird es bei meinem Mittagessen kritisch wenn ich deinen Post lese.... Ich hab dem guten Threadersteller aus mathematischer Sicht erklärt warum das ganze stimmt und das ist nunmal so wie ichs dort oben beschrieben hab... und die Potenzen sind natürlich nicht fürs Skript gedacht sondern einfach nur zur Erläuterung... Ansonsten hast du aber recht wobei es eigentlich unterschiedliche wege gibt an die entsprechende Stelle zu kommen wobei die von dir beschriebene die eleganteste ist... + Multi-Zitat Zitieren
#7 16. Mai 2007 AW: Rechtesystem mit Binärzahlen währe es nicht mit arrays besser z.b: PHP: <? php $levels = array( 0 => "Gast" , 1 => "User" , 2 => "Mitglied" , 3 => "Moderator" , 4 => "Administrator" ); // Beim Einloggen ID und Zugriffsrecht in Session speichern... function access ( $level ) { if( $_SESSION [ "level" ] >= $level ) { return true ; } else { return false ; } } // Und dann Abfragen if( access ( 3 )) { echo "mindestens MOD-Rechte" ; } ?> + Multi-Zitat Zitieren
#8 16. Mai 2007 AW: Rechtesystem mit Binärzahlen Nein, waere es nicht. Es geht nicht um die Bestimmung der Benutzergruppe, sondern den Usern einzelne Rechte zuzuweisen. Dafuer eigenen sich Dualzahlen hervorragend. Es gibt nur 1 und 0. Hat recht, hat Recht nicht. + Multi-Zitat Zitieren
#9 16. Mai 2007 AW: Rechtesystem mit Binärzahlen und selbst wenn du deine rechte (und nicht benutzergruppen) in einen array stecken würdest: 0 - darf nix 1 - darf in bereich A lesen 2 - das in bereich A posten 3 - darf in bereich A löschen nehmen wir an, du möchtest deine rechte erweitern (z.b. ist ein neuer bereich in dein projekt eingebunden) und es kommt 4 - darf in bereich B lesen 5 - darf in bereich B schreiben hinzu und nun möchtest du, dass ein neuer user nur in bereich B lesen darf (aber in A nix)... dann hängste da wie jesus am karfreitag... + Multi-Zitat Zitieren