Berechtigungsgruppen, DB-Layout und Abfrage

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Berechtigungsgruppen, DB-Layout und Abfrage

    Ich verwende zwei Tabellen um Berechtigungsgruppen abzubilden

    Code:
    CREATE TABLE permission_group (
      group_id int(10) unsigned NOT NULL auto_increment,
      group_parent_id int(10) unsigned NOT NULL default '0',
      group_name varchar(255) NOT NULL default '',
      group_active int(1) unsigned NOT NULL default '1',
      group_description text NOT NULL,
      PRIMARY KEY  (group_id),
      UNIQUE KEY group_name_parent (group_parent_id,group_name),
      KEY group_parent_id (group_parent_id),
      KEY group_name (group_name)
    );
    
    INSERT INTO permission_group VALUES (1, 0, 'USER', 1, 'Standardbenutzer (Dialog)'),
    (2, 1, 'GUEST', 1, 'Gastbenutzer'),
    (3, 1, 'BATCH', 1, 'Hintergrundbenutzer'),
    (4, 1, 'DEFAULT', 1, 'Standardbenutzer'),
    (5, 1, 'DEVELOP', 1, 'Entwickler'),
    (6, 5, 'VIEW', 1, 'Sourcecode einsehen'),
    (7, 5, 'EDIT', 1, 'Sourcecode ändern'),
    (8, 1, 'HR', 1, 'Human Resources'),
    (9, 8, 'VIEW', 1, 'Anzeigeberechtigungen für HR-Daten'),
    (10, 8, 'EDIT', 1, 'Änderungsbrechtigung für HR-Daten');
    
    CREATE TABLE permission_group_hierarchy (
      group_parent_id int(10) unsigned NOT NULL default '0',
      group_id int(10) unsigned NOT NULL default '0',
      PRIMARY KEY  (group_parent_id,group_id)
    );
    
    INSERT INTO permission_group_hierarchy VALUES (0, 1),
    (0, 2),
    (0, 3),
    (0, 5),
    (0, 6),
    (0, 7),
    (0, 8),
    (0, 9),
    (0, 10),
    (1, 2),
    (1, 3),
    (1, 4),
    (1, 5),
    (1, 6),
    (1, 7),
    (1, 8),
    (1, 9),
    (1, 10),
    (5, 6),
    (5, 7),
    (8, 9),
    (8, 10);
    (Ja, das ist TBTs menu_menu)

    Ich suche jetzt eine Möglichkeit, alle Berechtigungsgruppen, die ein Benutzer hat, auszulesen inklusive der übergeordneten Berechtigungen)

    Beispiel:
    Ich habe einen Standardbenutzer, der HR-Daten anzeigen darf und volle Entwicklerberechtigungen hat, für diesen Benutzer würde ich gerne die IDs 1, 4, 5, 6, 7, 8, 9 haben.
    Das ist ein einfaches
    Code:
    SELECT DISTINCT g.group_id, g.group_name
    FROM permission_group g
      INNER JOIN permission_group_hierarchy h ON g.group_id IN (h.group_id, h.group_parent_id)
    WHERE h.group_id IN (4, 9, 7)
    ORDER BY g.group_parent_id
    Das Sortieren brauche ich, da ich später den Berechtigungsgruppen Berechtigungen zuweise und die Möglichkeit haben will, einer untergeordneten Gruppe weitere Berechtigungen zu geben, aber auch Berechtigungen zu entziehen.

    Wenn ich jetzt die Enticklerberechtigungen abschalten will, setze ich group_active für die Gruppe mit ID 5 (DEVELOP) auf 0 und möchte demnach nur noch 1, 4, 8, 9 haben.
    Erweitere ich meinSELECT und schließe Berechtigungsgruppen mit group-active = 0 aus, dann bekomme ich allerdings 1, 4, 6, 7, 8, 9.
    Kann ich das irgendwie mit einer Abfrage abhandeln oder muss ich da mit PHP ran?
    Ich denke, also bin ich. - Einige sind trotzdem...

  • #2
    dazu mußt du die menu_menu Tabelle um die gleichlautenden Einträge 1,1 2,2 3,3 etc erweitern, und dann von menu auf menu_menu auf menu gehen ala

    Code:
    select c.menu_id, c.menu_name
    from menu a
    inner join menu_menu b
       on ( a.menu_id = b.child_id )
    inner join menu c
       on ( b.parent_id = c.menu_id )
    where a.menu_name = 'blabla'
    machst du diese Einträge nicht, mußt du eine langsamere OR Anweisung nehmen

    Code:
    select c.menu_id, c.menu_name
    from menu a
    inner join menu_menu b
       on ( a.menu_id = b.child_id )
    inner join menu c
       on ( b.parent_id = c.menu_id 
          or b.child_id = c.menu_id )
    where a.menu_name = 'blabla'
    PS: ich empfehle die Einräge hinzu zu packen, ist bei einer gut gefüllten Tabelle
    weit schneller, außerdem kann MySQL dort die Indizies nutzen ( bei OR nicht )
    TBT

    Die zwei wichtigsten Regeln für eine berufliche Karriere:
    1. Verrate niemals alles was du weißt!


    PHP 2 AllPatrizier II Browsergame

    Kommentar


    • #3
      Danke
      Ich denke, also bin ich. - Einige sind trotzdem...

      Kommentar

      Lädt...
      X