Andres Freund: Datenbankmodellierung einer Rechteverwaltung

Beitrag lesen

Hi Forum,

ich bin gerade am programmieren eines kleinen CMS (In Perl, auch wenn das nicht wirklich etwas zur Sache tut). Ich will dort ein möglichst flexibles Rechtesystem haben, da ich soetwas sehr praktisch finde. Mit Rechtesystem meine ich, dass ich entweder Gruppen, wie Z.B.Administratoren, Redakteuren, Gästen oder Mitgliedern, oder einzelnen Personen eigene Rechte einräumen kann. So kann ich etwa bestimmten Mitgliedern erlauben die eine Gruppe von Texten zu editieren, eine andere Gruppe kann z.B. "nur" die Komentare zu einzelnen Texten editieren. Allerdings soll aber User A der in Gruppe A ist, auch einen Text B editieren können, weil er von dem Thema besonders viel versteht oder so. Auch will ich dass nur bestimmte Gruppen Zugriff auf gewisse Funktionen haben können.
Momentan habe ich die folgenden Rechte, falls jemand da ncoh weitere hat, die er für wichtig hält, bitte sagen:

lesen,
sehen (überhaupt die Funktion sehen),
ausführen (bei bestimmten Funktionen),
schreiben,
editieren,
fremde Texte editieren,
löschen,
Rechte aendern,
Informationen einsehen (eventuell nützlich, wenn man einzelne Texte einkaufen kann),

Wie ich das mache ist mir im Prnzip schon klar, allerdings hapert es irgendwie nochn eventuell durch mangelnde Erfahrung und Eigenstudium ;-), noch mit der abbildung in der Datenbank, in der ich die Rechte reinschreibe.
Als Datenbanken möchte ich sowohl Postgres als auch MySql unterstützen.
Ich habe im Moment diese Tabellen, die wichtig für die Frage sind:
-User, Nur Id, Name und Pw
-Profil, Der Name sagt alles
-Texte, Alle Texte. Allerdings sind hierdrin nur der Name der TextId, xml-Datei, Autor, Titel, erstellungsdatum, Kategorie und Subkategorien gespeichert.
Gruppen, GruppenID, Gruppenname

Das waren die, bei denen ich keine Probleme habe, und nur zum besseren Verständniss angegeben habe. Nun die, mit denen ich Probleme habe:
-Gruppenmitglieder, im moment stehen hier nur User- und Gruppen-Id drinnen. Mein Problem ist, dass ich keinen sinnvollen Schlüssel habe. Klar, ich könnte einfach mit Auto-Increment eine Id erstellen, aber das halte ich für wenig sinnvoll.
-Rechte, momentan gibt es hier Felder für die oben genannten Rechte, User oder Gruppen Id und natürlich das Ziel, entweder ein bestimmter Text, oder eine Funktion. Momentan habe ich es so gemacht, dass negative User-Ids für User und positive für Gruppen sind, was aber nicht sonnvoll ist. Daher werde ich wohl zwei Tabellen machen müssen. Ich weiß aber nicht, wie ich dann sinnvoll überprüfen kann, ob der User seine gewollte Aktion durchführen kann. Das andere Problem mit dieser Tabelle ist, dass ich nicht weiß welchen Datentyp ich einsetzen soll um eine erlaubniss oder ein verbot auszudrücken. Momentan sind diese Felder smallints was aber bei einem einzelnen bit nicht sonderlich sinnvoll sein kann. Was sollte ich da nehmen? Ausserdem habe ich wieder das Problem, dass ich nicht weiß wie ich da einen sinnvollen primary key bekomme, da ja moment ein Tupel nur durch die Kombination von User/Gruppenid ausgewählt werden kann, was nicht gut sein kann. Ein weiteres Frage ist, ob ich für Funktionen und Texte verschiedene Tabellen nehmen soll.

So, ich hoffe das war einigermaßen verständlich, und ich habe nicht alzuviel vergessen. Falls die Tabellenstruktur nicht eindeutig sein sollte, mache ich auch noch ein paar Zeichnungen (Ascii oder echt).
Wahrscheinlich ist das ganze bloß ein Denkfehler, der schnell behoben werden kann.

mfg Andres Freund