benutzerrechte für websites und ähnliches...

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

  • benutzerrechte für websites und ähnliches...

    hi leute!

    bevor ich hier jetzt gesteinigt werde weil ich schon wieder einen neuen thread zu diesem thema erstelle möchte ich kurz loswerden dass ich da glaube ich gedanklich einen interessanten ansatz habe... und jetzt ohne lange umschweife...
    Code:
    benötigte tabellen:
    users:
      userid (int; unique; autoincr)
      groupid (varchar; zb: 3|5|6; standartwert: 2
        (sollte wohl über config einstellbar sein))
      rightid (int; staddartwert: 0)
      username (varchar; evtl unique)
      ...
    groups:
      groupid (int; unique; autoincr)
      grouprankid (int; evtl. unique)
      rightid (int; stadartwert: 2(sollte über config einstellbar sein))
      groupname (varchar; evtl unique)
    rights:
      rightid (int; unique; autoincr)
      can_view_news (tinyint; standartwert: 0)
      can_edit_news (tinyint; standartwert: 0)
      ...
    ich gehe davon aus dass alles erstmal NICHT (daher standartwert 0) erlaubt ist und erst dann erlaubt ist wenn der wert 1 ist...
    benutzer können in so vielen gruppen sein wie sie wollen (daher groupid in der users-tabelle auch als varchar)... welches gruppenrecht sich jetzt durchsetzt liegt an der grouprankid. benutzerrechte überschreiben jedes gruppenrecht (ist ja auch logisch weil wieso gebe ich einem benutzer denn sonst explizit ein bestimmtes recht?!? daher standartwert von rightid in der users-tabelle auch 0 weil)...

    die erste sql-abfrage wäre wohl welcher/n gruppe(n) der user angehört... danach die sortierung welche den höheren rang hat und somit tlw. die rechte der untergeordneten gruppen überschreibt... ist in einer untergeordneten gruppe das schreiben eines postings erlaubt in der übergeordneten jedoch mit 0 dann ist es erlaubt... ist in der übergeordneten gruppe jedoch zb -1 dann ist es explizit verboten und überschreibt somit wieder die berechtigung der untergeordnete gruppe...
    und sollte der user auch noch explizite userrechte haben so überschreiben die sofern -1 (explizit nicht erlaubt) bzw 1 (explizit erlaubt) wert gesetzt ist die gültigen gruppenrechte...
    Code:
    bsp:
    users: 1 | 1;2 | 3 | flow
    groups: 1 | 2 | 1 | rechte für user  bzw.: 2 | 1 | 2 | rechte für admins
    rights: 1 | 1 | 1 | ...
      bzw: 2 | 1 | -1 | ... bzw: 3 | 0 | 1 | ...
    
    daraus ergibt sich:
      can_view_news: 1
      can_edit_news: 1
    erklärung: das recht für admins (rightid: 2) überschreibt das recht für user (rightid: 1) weil
      das gruppenranking sagt 1 kommt vor 2... das explizite benutzerrecht (rightid: 3)
      überschreibt das gültige gruppenrecht sodass der user jetzt news verändern darf...
    sooo... und jetzt würde ich um konstruktive kritik an meinem vorschlag bitten... bzw falls jemand einen bsp-code machen möchte so würde ich mich sehr darüber freuen... *ggg*

    mfg
    flow

  • #2
    wozu varchar() ?

    und weiteren diskussionen zu dem thema vorzubeugen, einfach mal ein (eigentlich selbsterklärender) dump von mir ..... (natürlich ohne daten und queries)

    Code:
    -- 
    -- Table structure for table `uz_group`
    -- 
    
    CREATE TABLE uz_group (
      g_id int(10) unsigned NOT NULL auto_increment,
      g_name varchar(150) default NULL,
      g_pos int(10) unsigned NOT NULL default '1',
      PRIMARY KEY  (g_id)
    ) TYPE=MyISAM;
    
    -- --------------------------------------------------------
    
    -- 
    -- Table structure for table `uz_group_right`
    -- 
    
    CREATE TABLE uz_group_right (
      g_id int(10) unsigned NOT NULL default '0',
      r_id int(10) unsigned NOT NULL default '0',
      gr_pos int(11) NOT NULL default '1',
      PRIMARY KEY  (g_id,r_id)
    ) TYPE=MyISAM;
    
    -- --------------------------------------------------------
    
    -- 
    -- Table structure for table `uz_right`
    -- 
    
    CREATE TABLE uz_right (
      r_id int(10) unsigned NOT NULL auto_increment,
      r_name varchar(150) NOT NULL default '',
      PRIMARY KEY  (r_id)
    ) TYPE=MyISAM;
    
    -- --------------------------------------------------------
    
    -- 
    -- Table structure for table `uz_user`
    -- 
    
    CREATE TABLE uz_user (
      u_id int(10) unsigned NOT NULL auto_increment,
      u_name varchar(15) NOT NULL default '',
      u_pass varchar(32) NOT NULL default '',
      u_real_l varchar(30) NOT NULL default '',
      u_real_f varchar(30) NOT NULL default '',
      u_email varchar(50) NOT NULL default '',
      u_lastlogin datetime NOT NULL default '0000-00-00 00:00:00',
      u_checked set('y','n') NOT NULL default 'n',
      u_enabled set('y','n') NOT NULL default 'y',
      PRIMARY KEY  (u_id),
      UNIQUE KEY username (u_name)
    ) TYPE=MyISAM;
    
    -- --------------------------------------------------------
    
    -- 
    -- Table structure for table `uz_user_group`
    -- 
    
    CREATE TABLE uz_user_group (
      u_id int(10) unsigned NOT NULL default '0',
      g_id int(10) unsigned NOT NULL default '0',
      PRIMARY KEY  (u_id,g_id)
    ) TYPE=MyISAM;
    
    -- --------------------------------------------------------
    
    -- 
    -- Table structure for table `uz_user_right`
    -- 
    
    CREATE TABLE uz_user_right (
      u_id int(10) unsigned NOT NULL default '0',
      r_id int(10) unsigned NOT NULL default '0',
      PRIMARY KEY  (u_id,r_id)
    ) TYPE=MyISAM;
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      Abraxax, ich habe mal deine Datenbankstruktur übernommen und dabei etwas erweitert. Kann man das so schon verwenden oder gibt es hier noch was zu verbessern?

      Code:
      -- 
      -- Tabellenstruktur für Tabelle `my_grouppermissions`
      -- 
      
      CREATE TABLE `my_grouppermissions` (
        `g_id` int(10) unsigned NOT NULL default '0',
        `p_id` int(10) unsigned NOT NULL default '0',
        `value` text NOT NULL,
        PRIMARY KEY  (`g_id`,`p_id`)
      ) TYPE=MyISAM;
      
      -- --------------------------------------------------------
      
      -- 
      -- Tabellenstruktur für Tabelle `my_groups`
      -- 
      
      CREATE TABLE `my_groups` (
        `g_id` int(10) unsigned NOT NULL auto_increment,
        `g_name` varchar(100) NOT NULL default '',
        `g_default` mediumint(5) unsigned NOT NULL default '0',
        `g_order` mediumint(5) unsigned NOT NULL default '0',
        `g_level` mediumint(5) unsigned NOT NULL default '1',
        PRIMARY KEY  (`g_id`)
      ) TYPE=MyISAM AUTO_INCREMENT=1 ;
      
      -- --------------------------------------------------------
      
      -- 
      -- Tabellenstruktur für Tabelle `my_permissiongroups`
      -- 
      
      CREATE TABLE `my_permissiongroups` (
        `pg_id` int(10) unsigned NOT NULL auto_increment,
        `pg_parent` int(10) unsigned NOT NULL default '0',
        `pg_name` varchar(100) NOT NULL default '',
        `pg_title` varchar(100) NOT NULL default '',
        `pg_order` mediumint(5) unsigned NOT NULL default '0',
        `pg_level` mediumint(5) unsigned NOT NULL default '1',
        PRIMARY KEY  (`pg_id`),
        UNIQUE KEY `name` (`pg_name`)
      ) TYPE=MyISAM AUTO_INCREMENT=1 ;
      
      -- --------------------------------------------------------
      
      -- 
      -- Tabellenstruktur für Tabelle `my_permissions`
      -- 
      
      CREATE TABLE `my_permissions` (
        `p_id` int(10) unsigned NOT NULL auto_increment,
        `pg_id` int(10) unsigned NOT NULL default '0',
        `p_name` varchar(100) NOT NULL default '',
        `p_type` set('boolean','integer','string') NOT NULL default 'string',
        `p_default` text NOT NULL,
        `p_title` varchar(100) NOT NULL default '',
        `p_description` text NOT NULL,
        PRIMARY KEY  (`p_id`),
        UNIQUE KEY `variable` (`p_name`)
      ) TYPE=MyISAM AUTO_INCREMENT=1 ;
      
      -- --------------------------------------------------------
      
      -- 
      -- Tabellenstruktur für Tabelle `my_user2group`
      -- 
      
      CREATE TABLE `my_user2group` (
        `u_id` int(10) unsigned NOT NULL default '0',
        `g_id` int(10) unsigned NOT NULL default '0',
        PRIMARY KEY  (`u_id`,`g_id`)
      ) TYPE=MyISAM;
      
      -- --------------------------------------------------------
      
      -- 
      -- Tabellenstruktur für Tabelle `my_userpermissions`
      -- 
      
      CREATE TABLE `my_userpermissions` (
        `u_id` int(10) unsigned NOT NULL default '0',
        `p_id` int(10) unsigned NOT NULL default '0',
        `value` text NOT NULL,
        PRIMARY KEY  (`u_id`,`p_id`)
      ) TYPE=MyISAM;
      
      -- --------------------------------------------------------
      
      -- 
      -- Tabellenstruktur für Tabelle `my_users`
      -- 
      
      CREATE TABLE `my_users` (
        `u_id` int(10) unsigned NOT NULL auto_increment,
        `u_name` varchar(15) NOT NULL default '',
        `u_password` varchar(32) NOT NULL default '',
        `u_real_l` varchar(30) NOT NULL default '',
        `u_real_f` varchar(30) NOT NULL default '',
        `u_email` varchar(50) NOT NULL default '',
        `u_regdate` datetime NOT NULL default '0000-00-00 00:00:00',
        `u_lastlogin` datetime NOT NULL default '0000-00-00 00:00:00',
        `u_checked` set('y','n') NOT NULL default 'n',
        `u_enabled` set('y','n') NOT NULL default 'y',
        PRIMARY KEY  (`u_id`),
        UNIQUE KEY `username` (`u_name`)
      ) TYPE=MyISAM AUTO_INCREMENT=1 ;
      Eine Tabelle für die Sessions fehlt noch, weil ich mir hier noch nicht ganz sicher bin wie ich es machen werde.
      Zuletzt geändert von eRoZion; 16.02.2006, 19:56.
      [COLOR=#9C5245]Internet-Explorer[/COLOR] [COLOR=#334D7B]User und stolz drauf! :P[/COLOR]

      Kommentar


      • #4
        die session tabelle hat nichts mit der rechteverwaltung an sich zu tun. von daher habe ich sie auch nicht extra erfasst.
        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


        Kommentar


        • #5
          Sind vier Querys an die Datenbank in Ordnung, wenn man die Benutzerdaten abfragt? Eine Query könnte ich noch sparen, aber dann bräuchte ich noch eine weitere Tabelle, in der ich die Kombinationen der Gruppen ablege, was aber unnötig Datenmüll produzieren würde.

          Code:
          SELECT * FROM my_users WHERE u_id = '$u_id'
          
          SELECT * FROM my_user2group WHERE u_id = '$u_id'
          
          SELECT p.*, gp.value FROM my_groups AS g 
          LEFT JOIN my_grouppermissions AS gp USING (g_id) 
          LEFT JOIN my_permissions AS p USING (p_id) 
          WHERE g.g_id IN ($groupids) 
          ORDER by g.g_order ASC, g.g_default DESC
          
          SELECT p.*, up.value FROM my_userpermissions AS up 
          LEFT JOIN my_permissions AS p USING (p_id) 
          WHERE up.u_id = '$u_id'
          Also, so lassen oder doch besser Datenmüll produzieren?
          Zuletzt geändert von eRoZion; 17.02.2006, 23:51.
          [COLOR=#9C5245]Internet-Explorer[/COLOR] [COLOR=#334D7B]User und stolz drauf! :P[/COLOR]

          Kommentar


          • #6
            Ich erledige meine Rechte Abfragen in einer Query.
            daniel-portal.com/games Free Games and more

            Kommentar


            • #7
              sobald eine user-id bekant ist, braucht man i.d.r. auch nur eine query ...
              INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


              Kommentar


              • #8
                Das alles soll man mit nur einer Query auslesen können? Gebt mir bitte mal etwas Hilfestellung, damit ich das auch schaffe.
                [COLOR=#9C5245]Internet-Explorer[/COLOR] [COLOR=#334D7B]User und stolz drauf! :P[/COLOR]

                Kommentar


                • #9
                  anbei einfach mal meine query ... diese ist sicherlich noch verbesserungswürdig...


                  PHP-Code:
                  // rechte auslesen.
                  $this->db->query('SELECT
                                        r.r_id,
                                        r.r_name,
                                        IFNULL(g.g_id, "-1") g_id,
                                        IFNULL(g.g_name, "nicht zugeordnete Rechte") g_name,
                                        IF(ISNULL(ur.u_id) AND ISNULL(ug.u_id), "", "1") has_right
                                    FROM
                                        uz_right r
                                          LEFT JOIN uz_group_right gr ON r.r_id = gr.r_id
                                            LEFT JOIN uz_group g ON gr.g_id = g.g_id
                                              LEFT JOIN uz_user_group ug ON
                                                  gr.g_id = ug.g_id AND
                                                  ug.u_id = '
                  .(int)$this->get_user('id').'
                                          LEFT JOIN uz_user_right ur ON
                                              r.r_id = ur.r_id AND
                                              ur.u_id = '
                  .(int)$this->get_user('id').'
                                    HAVING
                                        has_right = 1
                                    ORDER BY
                                        g.g_id,
                                        r.r_id'
                  ); 
                  INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                  Kommentar


                  • #10
                    Ich sollte mir wohl mal die MySQL Dokumentation zu Gemütführen.
                    [COLOR=#9C5245]Internet-Explorer[/COLOR] [COLOR=#334D7B]User und stolz drauf! :P[/COLOR]

                    Kommentar


                    • #11
                      Hier ist meine neue Query.

                      Code:
                      SELECT
                          p.p_id,
                          p.p_name,
                          IF(ISNULL(up.u_id), gp.value, up.value) AS p_value
                      FROM
                          my_permissions AS p
                              LEFT JOIN my_user2group AS u2g ON (
                                  u2g.u_id = '$u_id'
                              )
                                  LEFT JOIN my_grouppermissions AS gp ON (
                                      p.p_id = gp.p_id AND
                                      u2g.g_id = gp.g_id
                                  )
                                  LEFT JOIN my_groups AS g ON (
                                      u2g.g_id = g.g_id
                                  )
                              LEFT JOIN my_userpermissions AS up ON (
                                  p.p_id = up.p_id AND
                                  up.u_id = '$u_id'
                              )
                      ORDER BY
                          g.g_order ASC,
                          g.g_default DESC
                      Da waren’s nur noch zwei. *sing*
                      [COLOR=#9C5245]Internet-Explorer[/COLOR] [COLOR=#334D7B]User und stolz drauf! :P[/COLOR]

                      Kommentar

                      Lädt...
                      X