[PHP] Rechtesystem mit Binärzahlen

Dieses Thema im Forum "Webentwicklung" wurde erstellt von SeXy, 13. Mai 2007 .

Schlagworte:
  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.
     
  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.
     
  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
     
  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
     
  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&ouml;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 );
     
  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...
     
  7. 16. Mai 2007
    AW: Rechtesystem mit Binärzahlen

    währe es nicht mit arrays besser z.b:
    PHP:
    <? php
    $levels 
    = array(
    =>  "Gast" ,
    =>  "User" ,
    =>  "Mitglied" ,
    =>  "Moderator" ,
    =>  "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" ;
    }
    ?>
     
  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.
     
  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...
     
  10. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.