Sinnvolle User & Rechteverwaltung

MiLa

Erfahrenes Mitglied
Halli Hallo,
ich schon wieder...

Also, diesmal mit einer etwas anspruchsvolleren Frage, wie ich denke...
Ich bin grade am Überarbeiten eines Rechtesystems.
Hier gibt es viele Möglichkeiten, ich möchte es bis ins kleinste Detail verwalten können.
Also die Seite ist Modular aufgebaut, in jedem Modul kann man mindestens einmal Hinzufügen/Bearbeiten/Entfernen und bisher habe ich es mit maximal 30 Modulen laufen.

So, nun stellt sich die Frage, wie realisiere ich am geschicktesten ein Rechtesystem, in dem möglichst genau eingestellt werden kann, wer was darf udn was nicht...

Danke schonmal für jeden konstruktiven Post :)
 
Hm, mein letztes Rechtesystem hab' ich so gemacht:

Jeder User hat eine ID, und ist Mitglied einer Gruppe.

Die erste MySQL-Tabelle beschreibt die Rechte der jeweiligen Gruppe:
Code:
  id   |    action   |    actor    |    privilege
id ist eine eindeutige Identifikation, eigentlich überflüssig..
action würde in deinem Fall die ID des Moduls sein
actor ist die ID der Gruppe
privilege ist ein enum Feld, mit den Werten Y, N und X für Spezialfälle.

Nun ist aber die privilege-Spalte für deine Zwecke ungeeignet.
Eine Lösung wäre z.B. keine enum-Typ zu nehmen, sondern einen Integer.
Der hätte dann Werte wie beim Linux-Rechtesystem.
Also z.B.:
Code:
1 => Hinzufügen
2 => Bearbeiten
4 => Löschen
Wenn die entsprechnde Gruppe in dem Modul beispielsweise gar nichts machen darf, wird diese Spalte auf 0 gesetzt.
Wenn Bearbeitet und gelöscht werden darf: 2 + 4 (6), Hinzufügen und Löschen: 1 + 4 (5) usw...

Dann machst du noch eine MySQL-Tabelle mit genau den gleichen Spalten, nimmst aber statt Gruppen für Actor Userids, womit man dann spezial-Rechte für bestimmte User setzen kann.

Zusätzlich musst du noch entscheiden, ob von Grund aus alles verboten ist und die Tabellen diese Verbote wieder aufheben, oder umgekehrt.
Sinnvoller ist wohl ersteres, weil man nur so präzise die privielege-Spalte ausnutzen kann.

hth
 
Okay, das mit dem habe ich auch schon überlegt, nur ich bin dann an dem überprüfen hängen geblieben...

1=Lesen
2=Hinzufügen
4=Bearbeiten
8=Löschen

PHP:
if($rechte==2)
{
  //Hinzufügen
}
if($rechte==4)
{
  //Bearbeiten
}

Aber wie stelle ich das an, wenn ich das zusammenzähle, ich kann mir da grade Keine Formel herleiten mit der ich das auslesen kann...

Klasischer Fall von Denkkfehler, was ?
 
Oh, nice :)
Wär ich nicht drauf gekommen dass es soetwas hier in der Tutorials Sektion gibt :)

Super...danke :) Werd ich mir mal reintun :D
 
Also das hat mich schonmal "leicht" weitergebracht, woran ich nun hänge:
Ist es sinnvoll das ganze so aufzufädeln?:

1= News hinzufügen
2= News bearbeiten
4= News löschen
8= Matches hinzufügen
16= Matches bearbeiten
32= Matches löschen
64= Team hinzufügen
128= Team bearbeiten
...
Und das gaze geht wie gesagt bei 30 Modulen ziemlich in die Höhe :/
Ich hab da irgendwie meine Denkblockade, wenn es darum geht....
 
Naja, Matches, Teams und News sind ja eigene Module!

Dann machst du einfach mehrere Zeilen in die erste MySQL-Tabelle.
Für jedes Modul eigene Zeilen, dann brauchst du da jeweils nur 1, 2 und 4!

Also pro Gruppe 30 Einträge. Ist zwar viel, lässt sich aber leicht mit einem PHP-Script machen. Ausserdem empfehl ich dir, ein Interface dafür zu machen, dann wird es noch einfacher.
 
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
 
Zuletzt bearbeitet:
@ Fabian:
Genau das habe ich ja zur Zeit, optimum wäre es nun für mich, wenn ich pro User nur eine Zahl/String hab und mit irgendeinem Algorythmus die Rechte daraus auslese.
Und exakt das ist mein Problem, das andere hätte ich auch selbst hinbekommen ;)

Aber danke an alle, die hier bisher ihren Senf dazu gegeben haben, besonders an den "bloddy newbie", das wird mit Sicherheit einigen weiterhelfen (mir leider nicht)

Also, hat jemand eine Idee für dieses Prinzip, was ich mir vorstelle ?!
 
man könnte... erst aus diese Tabelle USER_RECHTE rauslesen ob die Úseríd und die Moduleid, wo er sich gerade befindet, vorhanden ist.Dann fällt schon mal raus, dass man das Recht NULL brauch...

Dann kann man, wie oben schon gesagt..
Lesen 1 --> r_lesen
Schreiben 2 --> r_schreiben
Löschen 3 --> r_loeschen
Edit 4 --> r_edit

und speichern: r_lesen;r_schreiben;r_loeschen;r_edit

Dann könnte man die Rechtespalte aus der Tabelle per explode() teilen, und in einer Funktion nachschauen ob das jeweilige Recht vorhanden ist...Diese Funktion würde TRUE und FALSE zurückgeben...dann könnte man die Funktion
halt so gestalten, das sie als Argumente check_rights($Moduleid,$USERID,$gesuchtes_recht) aussehen...

schwift nun zwar en bissl ab... aber das mit dem 1+3 usw habe ich net ganz sooo durchblickt :P

cu alive
 
Zurück