Rolf B: Aufbau MySQL Tabelle für eine Rechtevergabe

Beitrag lesen

Hallo Bernd,

das grundsätzliche Konstrukt ist wie von dedlfix beschrieben: Ein User hat 0-n Rechte, ein Recht kann von 0-n Usern ausgeübt werden. Klassisches m:n, also drei Tabellen. Eine hast Du eh schon (die User), kommt die User-Rechte Tabelle und die Rechte Tabelle hinzu.

Was da an Details hineinkommt, ist durchaus diskutierbar.

Rechte-Tabelle: Minimal eine ID und der Name. Ich würde aber auch noch eine Kategorie hinzunehmen und als separate Spalte führen; diese Kategorie ist dann eine Art Namespace für die existierenden Rechte in dieser Kategorie. Eine Kategorisierung hast Du nämlich sowieso, zum Beispiel gibt es das Recht 'Bearbeiten' für Kalender und Todo-Liste. Ohne eine Kategorie-Spalte würdest Du sowas im Rechtnamen verankern und "TODO_BEARBEITEN" als Name festlegen. Das schreit gleich "zusammengesetztes Attribut", ist also nicht normalisiert und sollte darum in zwei Attribute geteilt werden. Du kannst dann beim Laden der Rechte für einen User auch gleich sauber darüber filtern, wenn Du in der Todo-Liste bist und die Rechte dieses Users für diese Komponente brauchst. Wozu alle Rechte des Users laden, wenn nur die für die Todo-Liste gebraucht werden...

Die Konsequenz wäre dann eine Kategorien-Tabelle, wo die Kategorien eine ID bekommen. Ob Du es so weit treiben willst, ist Deine Entscheidung. Ist ja alles Aufwand; und wenn die Rechte-Tabelle nicht zu groß ist, ist es auch in denormalisierter Form noch handhabbar.

Auf der anderen Seite hast Du die User. Wieviele sind es? Ist es beherrschbar, für jeden User alle Rechte einzeln festzulegen? Kann es sinnvoll sein, Usern Gruppen zuzuordnen und dann ein Recht an eine Gruppe zu vergeben? Du hast dann weitere Tabellen "Gruppe", "User-Gruppe" und "Gruppe-Recht".

Statt "Gruppe-Recht" und "User-Recht" einzeln zu führen, könntest Du sie auch in einer "Berechtigung" Tabelle zusammenfassen, müsstest dann aber über ein Attribut festlegen, ob sich eine Zeile darin auf User oder Gruppen bezieht. Das ist eigentlich unsauber.

Du könntest es auch noch anders machen: Du machst eine Tabelle "Rechteinhaber", und eine Zeile darin beschreibt einen User oder eine Gruppe. Damit haben Rechteinhaber eine eigene klare ID, und du brauchst nur eine Beziehungstabelle "Rechteinhaber-Rechte" sowie eine Hierarchietabelle für Gruppenmitgliedschaften. Eine Gruppe kann bei solchen Konstrukten typischerweise Benutzer oder andere Gruppen enthalten. Wenn Du die Rechte des Users X auf der Seite Y wissen willst, musst Du die Rechte aller Gruppen, in denen er sich direkt oder indirekt befindet, mit hinzunehmen. Sowas kann über eine rekursive SQL Query gelingen oder du programmierst es von Hand.

Drittens hast Du die Rechte selbst. Werden nur Rechte gegeben? Oder vielleicht auch Dinge verboten? Gerade wenn Gruppen ins Spiel kommen und Rechte vererben, kann sowas nötig werden. Vielleicht ist es aus bestimmten Gründen sinnvoll, die Gruppe X von der Gruppe Y erben zu lassen, aber eigentlich erbt man zu viel. Hier wird die Nummer schnell komplex, das solltest Du eher lassen, so lange sich nicht ein dringender Bedarf dafür ergibt.

Interessant ist auch die Frage nach der Gültigkeitsdauer von Rechten. Vergibst Du Rechte immer unbefristet? Oder brauchst Du auch die Möglichkeit, ein Recht zu befristen? In dem Fall wäre eine "Gültig-bis" Spalte in der Inhaber-Rechte Tabelle interessant.

Hast Du schon mal nach einem fertigen Rechte-Manager für PHP gesucht? Sowas gibt's bestimmt, und er könnte Dir eine Menge Kopfschmerzen sparen.

Rolf

--
sumpsi - posui - clusi