Bernd: Aufbau MySQL Tabelle für eine Rechtevergabe

Hallo,

ich habe eine Frage zum Aufbau einer MySQL Tabelle. Und zwar soll es um Berechtigungen gehen. Ich habe diverse Unterseiten wie z.B.:

  • Dashbord
  • Zeiterfassung
  • To-Do Liste
  • Kalender
  • Personal

Darunter gibt es Punkte wie:

  • Neu hinzufügen
  • Löschen
  • Bearbeiten
  • Deaktivieren

Jetzt möchte ich gerne jedem User bestimmte Rechte vergeben.

Kleines Beispiel:

Kalender

  • User A darf den Link sehen, darf ein Eintrag bearbeiten
  • User B darf den Link sehen, darf einen Eintrag löschen, bearbeiten und deaktivieren
  • User C darf den Link überhaupt nicht sehen
  • User D darf den Link sehen und einen Eintrag deaktivieren

So möchte ich die komplette Seite überarbeiten.

Jetzt meine Frage, wie würdet ihr die Tabelle aufbauen? Meine Idee

id
user
seite
nav
bearbeiten
entfernen
deaktivieren
hinzufuegen
  1. Tach!

    Darunter gibt es Punkte wie:

    • Neu hinzufügen
    • Löschen
    • Bearbeiten
    • Deaktivieren

    Daran sind also Rechte verknüpft, die man haben muss, um die Aktion auszuführen.

    Jetzt möchte ich gerne jedem User bestimmte Rechte vergeben.

    Das wäre eine m:n-Beziehung zwischen Nutzern und Rechten.

    Jetzt meine Frage, wie würdet ihr die Tabelle aufbauen?

    Drei Tabellen, die User mit ihren Daten, die Rechte, wobei das meist nicht mehr als ein eindeutiger Name sein wird, und eine Tabelle für die m:n-Beziehung.

    Die Frage ist nun, wie das Programm arbeitet. Im Prinzip reicht es meist, das benötigte Recht zu einer bestimmen Aktion direkt im Code zu verankern (beispielsweise dessen Namen, der mit dem Tabelleneintrag übereinstimmen muss) und vor Ausführung zu überprüfen. An dieser Stelle braucht man eigentlich keine Flexibilität. Die hat man an der Stelle, wo das Recht beliebigen Nutzern zugewiesen werden kann.

    dedlfix.

  2. hi,

    Jetzt meine Frage, wie würdet ihr die Tabelle aufbauen? Meine Idee

    id
    user
    seite
    nav
    bearbeiten
    entfernen
    deaktivieren
    hinzufuegen
    

    Eine Tabelle? Ich würde das aufteilen. Und zwar die Benutzer in Gruppen. MfG

  3. 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