Grundsätzlich ist es wohl am sinnvollsten, wenn User Rechte von Gruppenrichtlinien vererben und dennoch über eigene Rechte verfügen können.
So hat man zwar anfangs etwas Mühe, die Gruppen zu erstellen, kann diese im Nachhinein jedoch ohne weiteres einem Benutzer zuordnen.
Zusätzlich sollten jedem User nicht gruppenspezifische Rechte zuweisbar sein, um dem gesamten Usersystem mehr Flexibilität einzuflössen.
Lösungsansatz:
Benutzertabelle - usersystem_users
---------------------------
user_id, group_id, user_vorname, user_name, user_email,....
->group_id ist ein Foreignkey der nachfolgenden Gruppentabelle...der Rest ist selbsterklärend
Gruppentabelle - usersystem_groups
-----------------------
group_id, name, permission1, permission2,...
->permission steht hier für ein Modul deiner Webseite und kann mit Werten in zuvor geposteten Beiträgen gefüllt werden (1,2,4)
Spezial-Benutzer-Rechte - usersystem_user_permissions
--------------------------------------
user_id, permission1, permission2,....
->user_id ist ein Foreignkey der Benutzertabelle...permission steht auch hier für die einzelnen Module der Webseite
##########################################################
Um die Berechtigungen nun auf jeder Seite parat zu haben, empfielt es sich diese am Anfang eines jeden Scriptes in einem Array zur Verfügung zu stellen.
1.) Userdaten auslesen
PHP:
//user_id sollte ja bekannt sein...
$sql = "SELECT * FROM ".USER_TABLE." WHERE user_id = '".user_id."'";
$result = mysql_query($sql,$db);
//die komplette Reihe entählt nun alle Userdaten
$userdata = mysql_fetch_array($result);
//$userdata['user_id'], $userdata['group_id'],$userdata['user_vorname'],...
Nun fehlen uns nur noch die Berechtigungen dieses Users
2.) Berechtigungen auslesen
PHP:
//...Gruppenrechte
$sql = "SELECT * FROM ".GROUP_TABLE." WHERE group_id = '".$userdata['group_id']."'";
$result = mysql_query($sql,$db);
//die komplette Reihe als Array sind die Permissions
$permissions = mysql_fetch_array($result);
//Nun haben wir schon mal die Gruppenrechte dieses Users in einem Array vorzuliegen...
//...die individuellen Rechte haben allerdings Vorrang und werden daher
//...etwaige Gruppenrechte überschreiben...
$sql = "SELECT * FROM ".USER_PERMISSION_TABLE." WHERE user_id = '".$userdata['user_id']."'";
$result = mysql_query($sql,$db);
//Sind Einzelrechte vorhanden?
if(mysql_num_rows($result) > 0)
{
//es sind Einzelrechte vorhanden...
//...die Gruppenrechte werden überschrieben
//...andernfalls existieren ja Gruppenrechte oder keine Rechte
$permissions = mysql_fetch_array($result);
}
//In $permissions liegen nun eben alle Rechte in folgender Form vor
//...$permissions['permission1'], $permissions['permission2'], $permissions['permission3'],
Ich habe mir weiterhin angewöhnt, Rechte und Tabellennamen als Konstanten in einer gesonderten PHP-Datei festzulegen und irgendwo zu Beginn eines jeden Scriptes zu includieren.
Bsp.:
PHP:
//Berechtigungen
define(NEWS_MODUL, "permission1");
define(BLA_MODUL, "permission2");
define(BLUB_MODUL, "permission3");
//Tabellen
$prefix = 'usersystem_';
define(USER_TABLE, $prefix ."users");
define(GROUP_TABLE, $prefix ."groups");
define(USER_PERMISSION_TABLE, $prefix ."user_permissions");
..was eine aussagefähige Bezeichnung der Felder innerhalb der Tabellen überflüssig macht - es reicht also permission1, permission2, permission3.
Im Querry werden diese Konstanten dann so verwendet:
PHP:
// ".GROUP_TABLE."
SELECT * FROM ".GROUP_TABLE." WHERE group_id = '".$userdata['group_id']."'
//und beim Überprüfen:
switch($permissions[NEWS_MODUL] )
{
case 1:
//du darfst lesen
break;
case 2:
//du darfst schreiben und lesen aber nicht editieren
break;
case 4
//du darfst alles
break;
}
Ich hoffe, das ich etwas brauchbares zu eurer Diskussion beitragen konnte und entschuldige mich schonmal für die Überlänge meines Postings
Bloddy Newbie