Benutzerverwaltung mit Gruppen u. einzelnen Rechten

So nach 1 Tag googlen werde ich mir immer unschlüssiger, wie ich meine Rechteverwaltung realisieren soll. Ich habe mir jetzt als letztes die Verwaltung vom phpbb3 mal etwas angeschaut, aber die ist mir doch etwas zu komplex.

Ich möchte nach möglichkeit eine Variable anzahl an Rechten(erweiterbar) sowohl über Gruppen als auch einzeln(Recht geben ohne gruppenzuordnung) verwalten. Schön wäre natürlich noch wenn das ganze 3 Zustände hätte, ja, nein, und niemals(damit nicht von anderm recht überschrieben werden kann…) muss aber nicht sein.

Welche Verwaltung könnte ich mir da mal als Vorlage anschauen? bzw. wer hat vorschläge für den Datenbankaufbau? Bis jetzt hab ich nur eine usertabelle mit ID.

mfg

Hi,

vor dem selben Problem stand ich bis zum letzten WE auch. Die Verwaltung bei CMS und Foren ist meist sehr komplex und für die Dinge die (zumindest ich) man braucht etwas zu überladen.
Ich habe es jetzt wie folgt realisiert.

Ich habe eine Tabelle mit ID, Name, E-Mail etc vor mir liegen und habe jetzt mal 5 verschiedene Gruppen. Die Rechteverwaltung läuft auf das gleiche Prinzip hinaus. Ich hab einfach eine Spalte Gruppen hinzugefügt die eine fünfstellige Zahlenkolonne beinhaltet.

00000 - Mitglied in keiner Gruppe
00101 - Mitglied in Gruppe 3 und 5
10990 - Mitglied in Gruppe 1, niemals Mitglied in Gruppe 3 und 4
usw…

Sicherlich nicht die eleganteste Lösung, jedoch funktioniert sie bei mir tadellos und ohne großartig langwierige Abfragen

Wie ihr auch, stand ich ebenfalls mehrfach vor dem Problem und hatte mir vor kurzem eine Lösung wie folgt gedacht, die es auch in anderen Anwendungsbereichen gibt (in einer Firewall (synaptic?) hatte ich sowas schon gesehen).

Eine Zugriffsliste die nach eine Bestimmten Reihenfolge soritert wird, und je nach dem welche “Regel” als erstes zu trifft, diese gilt dann.

Aufbau so oder so ähnlich: ein feld für Das Objekt (Seite/Module, oder ähnliches) auf das Zugegriffen werden soll, User oder Gruppe die darauf zu greifen möchten, art der erlaubten zugriffe (lesend? schreibend? und ähnliches), und dann natürlich noch die position der Regel.

Wenn jetzt eine Gruppe nur lesenden zugriff auf einen bestimmten bereich hat, man möchte aber einen user der in dieser Gruppe ist auch schreibenden zugriff geben, so erteilt man dem eine zusatz regel die einfach höher steht als die der Gruppe.
Auslesen tut man dann nur die Regeln die den aktuellen Benutzer betreffen.

gibt sicherlich bessere Methoden, aber das wäre relativ leicht zu realisieren, meiner Meinung nach.

@kerbi: bei deiner Lösung kannst du aber nur dann die Regeln für die komplette gruppe regeln, dafür ist dann das mit niemals inegriert bei überschneidungen von mehreren gruppenrechten

balmungs lösung les ich mir nochmal in ruhe durch, da ich gerade nicht ganz checke wie du die priorität der regeln machst und wie ich die zugriffliste am besten mache.

Die Vergabe für Benutzerrechte funktioniert bei mir äquivalent zu den Gruppenrechten, allerdings mit eienr kleinen Ausnahme.

Wir gehen wieder von 5 Gruppen aus, deren Rechte durch nummerische Folgen festgelegt werden. Und dass der benutzer jetzt für Gruppe 2 globales Gruppenrecht besitzt. Hinzu kommt jetzt jedoch noch, dass der Benutzer das Benutzerrecht (gehen wir mal von 1 lesen, 2 schreiben und 3 löschen aus) hat Dateien zu löschen.

Die Tabelle bei mir sieht bei einer solchen Abweichung etwa so aus:

|-ID-|Name------|P|Benrecht--|Gruprecht-|
|----|----------|-|----------|----------|
|25--|kerbi-----|1|001-------|01000-----|
-----------------a-bcd-------efghi

a - Prüfziffer: 1 wenn Benutzerrechte aktiv, 0 wenn nicht. Bei 1 wird Benutzerrecht priorisiert, sonst nicht.
b - Benutzerrecht lesen = 0 - keine Berechtigung
c - Benutzerrecht schreiben = 0 - keine Berechtigung
d - Benutzerrecht löschen = 1 - Berechtigung aktiv
e - Gruppenrecht 1 = 0 - keine Berechtigung
f - Gruppenrecht 2 = 1 - Berechtigung aktiv
g - Gruppenrecht 3 = 0 - keine Berechtigung
h - Gruppenrecht 4 = 0 - keine Berechtigung
i - Gruppenrecht 5 = 0 - keine Berechtigung

So funktioniert das bei mir.

Die Prioritäten sind einfach: die einzelnen Regeln werden ja sortiert nach “position”, und jede Regel ist entweder einer Gruppe oder einem User zugewiesen.
Für den aktuellen User, der sich gerade auf der Seite befindet, werden alle Regeln ausgelesen die benötigt werden (alle die ihn als user direkt betreffen, oder die regeln die ihn als gruppen mitglied betreffen), natürlich indem die reihenfolge der “position” erhalten bleibt.
Wenn man jetzt wissen möchte ob der Aktuelle User zugriff auf ein Bestimmtes Forum hat, liest man alle Regeln von oben bis unten ab, und je nach dem welche Regel als erstes das gefragte Forum betrifft, diese Regeln gelten dann für den User.

Sollte er zum Beispiel in der Gruppe “Ab 18” sein und somit zugriff auf das extra Forum “Ab 18” haben, so würde wahrscheinlich die Regel zutreffen, die ihm lese und schreibzugriff auf das Forum gibt.

| pos | modul | user | group | read | write | ... | 45 | forum "ab 18" | - | "ab 18" | 1 | 1 |
möchte man jetzt diesen EINEN user die schreibrechte aus dem forum entziehen, (weil er mist gebaut hat oder so), dann setzt meine eine extra regel für ihn einfach darüber:

| pos | modul | user | group | read | write | ... | 44 | forum "ab 18" | Hans | - | 1 | 0 | | 45 | forum "ab 18" | - | "ab 18" | 1 | 1 |

Die Regeln würden von oben nach unten abgeklappert werden. die Regeln #44 und #45 würden beide auf ihn zutreffen, aber #44 würde als erstes kommen und somit ist das die aktive Regel.

Edit:
statt “modul” und “read/write” könntest du auch “action” und “value” nehmen… wobei “action” dann sowas wie “read_forum” enthält und “value” dann 1 für ja, und 0 für nein. Die Struktur der Tabelle ist hier egal, um das Prinzip geht es mir eher…

mfg Balmung

Die Lösung finde ich noch besser :o)
Mal schauen ob ich sie auf meine DB umsetzen kann…

// Bei Balmungs Beispiel könntest du die Werte ja ne weiteres näher definieren, indem du anstelle von 0 und 1 weitere Ziffern einträgst. Etwa die 2 für ‘niemals’

/// klappt wunderbar.
Ich hab 8 verschiedene Mitgliedrränge, die ich so deutlich einfacher festlegen kann, in einer einzigen Spalte mit nur einer einzigen Ziffer - und als zweiten Wert die Zensurkontrolle ein/ausschalten kann.
Danke Balmung :slight_smile:

Ich glaube ich mach es doch lieber mit ein paar mehr tabellen, um flexibler zu sein, bei balmungs lösung kann ein user z.B wieder nur in 1 gruppe sein, sofern man die Gruppen direkt in der usertabelle speichert und nicht in ner seperaten tabelle.

man könnte die ziffer auch als bitmaske verwenden, um lesen schreiben und löschen zu realisieren.

bei balmungs lösung taugt mir das mit der position nicht, da man wenn man die rechte ändert immer die position ändern muss, man könnte aber einfach userrechte höher als gruppenrechte stellen.

die position muss “man” ja nicht ändern, sondern lediglich dafür sorgen, dass das alles vom script richtig geregelt wird.
Und limitiert auf eine Gruppe pro User ist es mit sicherheit nicht, ich hab ja nirgendwo geschrieben wie die Gruppenregelung sein soll, das kommt auf die letztendliche Umsetzung drauf an. Man kann das rumbiegen wie man will, nur halte ich eben nicht viel von diesen Zahlen/Bitfeldern in einem Feld… das ist eher weniger normalisiert (mein Beispiel zwar auch nicht, ist aber auch ein eher schlechtes Beispiel)

Habe ja gesagt, sofern man es direkt in der usertabelle speichert…

wie gesagt, ich werde vermutlich einfach einzelne regeln höher bewerten als gruppenregeln, regelung der position durch das script ist mir zu aufwändig :smiley:

wobei ich jetzt mal ein gute stichwort in google gefunden hab ACL, mal schauen vielleicht findet sich ja noch was das mir zusagt