#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
#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 ) ? 1 : 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 );}