Login-System - Berechtigungsvergabe



  • Hi Leute,

    habe ein Loginsystem und möchte jetzt was dran ändern:

    bisher sah meine Usertabelle so aus:

    username password berechtigung
    hans wurst admin
    peter pan user
    usw.

    Jetzt würde ich aber gerne den user in eine tabelle und seine berechtigung in ne andere tabelle speichern, da er jetzt mehrere berechtigungen bekommen soll:

    usertabelle:
    username password
    hans wurst
    peter pan

    berechtigungstabelle:
    username berechtigung
    hans admin
    hans user
    peter user
    usw.

    Das Problem dabei ist, dass ich die userberechtigung auf den Seiten bisher einfach aus der Datenbank ausgelesen habe, in die Session gespeichert und dann so

    if ($_SESSION['userPermission']=="user")
    

    überprüft habe.
    Wie speichere und prüfe ich nun aber mehrere Berechtigungen?
    Ich komm da irgendwie nicht drauf.

    Hoffe ihr könnt mir helfen,

    thx, mfg
    dope_dope



  • 2 Tabellen halte ich für überflüssig. Selbst wenn du mehrere Berechtigungen hast, dann pack die doch in eine Array, benutzte serialize() um das ganze in einen String umzuwandeln und pack das dann in ein Feld. Übrigens hab ich bei mir das ganze nicht mit Strings gemacht, sondern mit Zahlen, 0 = Normaler User, 1 = Moderator, 2 = Admin und 3 = Super-Admin, String-Vergleiche nerven irgendwie.

    Aber zurück zu deiner Frage, du brauchst 2 Querys. Einmal holst du dir die ID (oder ebend über den Namen, was aber nicht so zu empfehlen ist, lieber immer Zahlen, also ne ID benutzen) des Benutzers aus der Benutzertabelle. Dann fragst du in der anderen Tabelle dann ab, wie die Rechte der ID sind und schon hast du die Rechte:

    SQL -> SELECT brechtigung FROM berechtigungstabelle WHERE id = $userID
    


  • Also 2 Tabellen halte ich schon für sinvoller als alle berechtigungen hintereinader in ein feld und dann den string zerteilen, oder wie meinst du das?

    Dass ich zwei Abfragen brauche ist mir schon klar, aber wenn ich das hier mache:

    SQL -> SELECT brechtigung FROM berechtigungstabelle WHERE id = $user
    

    bekomme ich als abfrageergebnis z.b.
    admin
    user
    usw.
    weil der eine benutzer halt mehrere berechtigungen hat. Und diese mehreren Berechtigungen möchte ich gerne irgendwie speichern weil ich nicht jedesmal neu an der datenbank anfragen will.
    Da mir nichts anderes einfällt werde ich die berechtigungen also in ein array speichern müssen (aber woher weiß ich denn wie groß das sein muss?)
    und dann jedes element des arrays einzeln überprüfen ob die berechtigung drin steht (aber woher weiß ich denn wie viele elemente das array hat?)
    ???



  • Ich versteh dich leider irgendwie nicht richtig, beschreib doch mal ein wenig präziser wie das System funktionieren soll und worum es überhaupt geht. Es sollte kein Problem bei jedem Aufruf die Berechtigung neu auszulesen aus der DB, normalerweise sind Datenbanken für sehr hohe Zugriffraten ausgelegt. Z.B. in einer Forensoftware wie phpBB, die z.B. auch in diesem Forum genutzt wird, werden die Benutzerdaten auch jedesmal neu ausgelesen.

    Btw, die Länge eines Arrays bekommt man in PHP mit count() heraus.



  • Du könntest auch ein Bitfeld verwenden 💡



  • Bitfeld????

    Nächster Versuch:
    Ich möchte die Berechtigung nicht jedes mal neu abfragen, weil ich sie in der SID zusammen mit username usw. einfach an jede Seite übergeben möchte.
    Bisher habe ich

    $_SESSION[userPermission]=$data[permission]
    

    ´
    gemacht, also die Berechtigung aus der DB direkt in die Session-Variable gepseichert.
    und dann habe ich die Berechtigung auf diversen Seiten so:

    if ($_SESSION['userPermission']=="user")
    {
        //show content
    }
    else
    {
       / du kommst hier net rein..
    }
    

    überprüft
    Wie mache ich das nun mit mehreren Berechtigungen???



  • Bitfeld heißt, dass du einfach einen Zahlenwert speicherst und dort für jede vorhadene Berechtigung das entsprechende Bit setzt.

    Beispiel:
    gast 1 (Bit 1): 00000001
    user 2 (Bit 2): 00000010
    admin 4 (Bit 3): 00000100
    superuser 8 (Bit 4): 00001000

    Soll ein User jetzt z.B. User- und Admin-Rechte bekommen, so setzt du die Bits 2 & 3: 00000110

    Zu den Bit-Operatoren findest du hier etwas 🙂

    define ("GAST", 1);
    define ("USER", 2);
    define ("ADMIN", 4);
    define ("SUPERUSER", 8);
    
    // Der User Rechte geben:
    $user_rights = USER | ADMIN;
    
    // Recht testen
    if($user_rights & ADMIN) {
      // ...
    }
    

    Falls du noch Verständnis-Probleme hast kannst du ja nachfragen 😉


Anmelden zum Antworten