[SQL] Berechtigungssystem

Dieses Thema im Forum "Webentwicklung" wurde erstellt von cable, 2. März 2011 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 2. März 2011
    Berechtigungssystem

    Hoi!

    Ich habe ein kleines Projekt am laufen, möchte dieses aber nun ausbauen und brauche dafür natürlich auch ein gutes Konzept. Mit dabei ist auch eine Userverwaltung mit Berechtigungen. Bis jetzt hatte ich folgende Tabellen:

    Code:
    user
    group
    right
    group_right
    So war jeder User in einer Gruppe und jede Gruppe hat div. Rechte, die in der Tabelle right definiert wurden. Problem ist nun, dass ich Usern nicht einzeln Rechte zuweisen kann (oder nehmen). Des Weiteren kann es natürlich passieren, dass die Tabelle group_right sehr groß werden kann. Könnte ich das insg. besser umsetzen? Vielleicht um eine Tabelle user_right erweitern, in der ich dann explizite Rechte noch zuweise? Aber auch da kann ich keine einzelnen Rechte nehmen (wobei das prinzipiell auch nicht sooo wichtig wäre).

    greez
     
  2. 2. März 2011
    AW: Berechtigungssystem

    das macht man so:

    tabellen:
    users { id, name ...}
    groups { id, name ... }
    rights { id, name, default }
    rights2user { user-id, right-id, value }
    rights2group { group-id, right-id, value }

    und in deiner app lädst du zuerst die gruppe-rechte und anschließend überschreibst du diese ggf. mit den user-rechten.
     
  3. 2. März 2011
    AW: Berechtigungssystem

    Ich hatte das so gelöst, dass wenn ein Eintrag in der Tabelle group_right vorhanden war, dann hatte die Gruppe das Recht auch. Wofür ist die Spalte default in rights und wofür die value Spalten in den anderen beiden Spalten (rights2user und rights2group)?

    greez
     
  4. 2. März 2011
    AW: Berechtigungssystem

    users { 1, 'Hans' ...}
    groups { 1, 'Mitglied' ... }
    groups2user { 1, 1 ... }
    rights { 1, 'Schreiben', '1' }
    rights2user { 1, 1, 0 }
    rights2group { 1, 1, 1 }

    Benutzer "Hans" ist in der Gruppe "Mitglied", die Gruppe hat das Recht zu Schreiben, "Hans" aber nicht
     
  5. 2. März 2011
    AW: Berechtigungssystem

    Ok, das habe ich verstanden, also das mit den rights2group und rights2user und dem value, aber das mit dem default ist mir nicht ganz bewusst.

    Also wenn ein Recht nicht explizit gegeben wurde für eine Gruppe oder einen Nutzer, das Recht bei default aber 1 oder true hat, dann haben die Nutzer das Recht also?

    greez
     
  6. 2. März 2011
    AW: Berechtigungssystem

    Die Tabelle "rights" gilt für alle, mit "rights2user" und "rights2group" kannst du "default" wert überschreiben.

    Ist "default" 1 bei "schreiben" dann kannst du einem User mit "rights2user" oder einer Gruppe mit "rights2group" über "value" mit "0" das Schreiben Verbieten.
     
  7. 3. März 2011
    AW: Berechtigungssystem

    Umgesetzt und dicht. Falls im übrigen jemand Zeit hat und würde gerne an dem Projekt helfen, dann bitte per PN melden.

    greez

    //Nun stehe ich vor einem neuen Problem. Ich hatte mir überlegt, dass die Rechte pro User gecacht werden. Dies sollte so geschehen, dass zuerst alle Rechte gecacht werden, die jeder hat (also default = 1). Danach fügt man die Rechte hinzu, die die Gruppe des Nutzers hat. Davon zieht man dann die Rechte ab, die der Gruppe explizit entzogen wurden. Schließlich noch alle exklusiven Rechte des Users dazu und von der gesamten Menge dann die Rechte subtrahieren, die dem User entzogen wurden.

    Leider gibt es in MySQL keinen EXCEPT oder MINUS Befehl, mit dem ich die Rechte dann abziehen könnte. Zum Verbinden würde UNION je genügen. Man kann ein MINUS natürlich auch nachbauen, aber darauf habe ich nicht so viel Lust, da der Ausdruck dann noch viel länger werden würde. Könnte/Sollte ich es anders lösen?

    greez
     
  8. 4. März 2011
    AW: Berechtigungssystem

    Mal ein Push...
     
  9. 4. März 2011
    AW: Berechtigungssystem

    du musst zuerst für dich selber eine lösung finden, wie du die prioritäten setzt.

    ich mach es meist so:

    vererbung:
    gruppe 1 [, gruppe 2 [, gruppe N]] erweitert: benutzer

    überschreiben von rechten:
    1 + 1 = 1
    1 + 0 = 0
    0 + 1 = 1

    PHP:
    $perms_loaded  load_group_permissions ();
    $perms_user    load_user_permissions ();

    foreach (
    $perms_user  as  $perm  =>  $value )
        
    $perms_loaded [ $perm ] = ( $value ) ?  0 ;
     
  10. 4. März 2011
    AW: Berechtigungssystem

    Jo, so hatte ich mir das auch gedacht. Aber wenn ich mir das so anschaue, dann bräuchte man doch die Spalte default in der rights Tabelle nicht, oder? Also es geht doch eigentlich nur darum, dass es bestimmte Rechte gibt und wem diese zugewiesen sind oder eben nicht.
    Also weist man es Gruppen zu und ggf. entzieht man Sie bestimmten Usern. Das würde auch deinem Code entsprechen.

    Aber nun noch mal zu dem Cache: Sollte ich die Rechte als große Matrix im Cache speichern mit Usern und Rechten?

    greez
     
  11. 7. März 2011
    AW: Berechtigungssystem

    ich zeig dir mal die funktion, die ich selbst verwende:
    (noch in bearbeitung, kann sein das fehler drinnen sind)

    PHP:

    protected function  loadOptions ()
    {   
        
    $option_table  = array();
        
    $options       = array();
        
        if (
    System :: getCache ()-> fetch ( 'options-table' true $option_table )
         && 
    System :: getCache ()-> fetch ( 'option-defaults' true $options ))
            goto 
    load_group_opts ;
            
        
    $query  System :: getDb ()-> query ( '
            SELECT `id`, `name`, `default`, `type`
            FROM `options_table`'
    );
        
        while (
    $option  $query -> fetch ()) {
            
    $option_table [] =  $option [ 'id' ];
            
            
    // save default
            
    $options [ $option [ 'name' ]] = new  Option ( $option [ 'type' ],  $option [ 'value' ]);
        }
        
        
    System :: getCache ()-> store ( 'options-table' $option_table );
        
    System :: getCache ()-> store ( 'option-defaults' $options Cache :: SERIALIZED );
        
        
    load_group_opts :
        
        if (
    $this -> get ( 'id' ) ===  0 )
            
    $this -> add ( 'groups' 1 2 );  // 1 = everyone, 2 = guests        
         
        
    $query  System :: getDb ()-> query ( '
            SELECT ot.`id`, ot.`name`, ot.`type`, ov.`value`
            FROM `option_value` ov
            LEFT JOIN `option_table` ot ON (
                pv.`option-id` = ot.`id` )
            LEFT JOIN `groups` g ON (
                g.`id` = ov.`group-id` )
            WHERE ov.`group-id` IN(' 
    implode ( ',' $this -> get ( 'groups' )) .  ') &&
                  ov.`option-id` IN(' 
    implode ( ',' $options_table ) .  ')
            ORDER BY g.`priority`'
    );
        
        while (
    $option  $query -> fetch ()) {            
            
    $value  = new  Option ( $option [ 'type' ],  $option [ 'value' ]);
            
            if (isset(
    $options [ $option [ 'name' ]]))
                
    $value  $options [ $option [ 'name' ]]-> merge ( $value );
            
            
    $options [ $option [ 'name' ]] =  $value ;
        }
        
        
    $this -> options  = new  OptionHash ( $options Hash :: READ_ONLY );
    }

     
  12. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.