Antje Hofmann: Datenbankmodellierung einer Rechteverwaltung

Beitrag lesen

Hallo Andreas,

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:

Rechteverwaltungen sind so eine Sache für sich. Allerdings sollte jede Rechteverteilung gut strukturiert und klar durchdacht sein.

Rechte werden ja unterschiedlich gehandhabt. Sehr häufig werden Rechte in Gruppen, Rollen und Rechte unterteilt. Gruppen beschreiben eher ein Rechteset auf eine Klasse von Objekten, z.B. einem Verzeichnis in dem gearbeitet werden kann. Rollen eine Funktion, die eine Summe von Rechten beinhaltet. Im CMS-Bereich werden da meist die Rollen Administrator, Publisher und Editor verwendet. Jede dieser Rollen beschreibt einen Abschnitt des Redaktionsprozesses. Dazu gibt es dann die Rechte. Rechte sind meist einer Rolle zugeordnet, können aber auch objektbezogen vergeben werden. Aus der Summe der einem Nutzer, einer Gruppe oder einer Rolle zugeordneten Rechte ergeben sich die Aktivitätsmöglichkeiten eines Nutzers.
Soweit zur Theorie. Die Praxis zeigt, dass eine ausgeklügelte Rechteverwaltung mit klar definierten Nutzergruppen, Rollen und Rechten nur dann Sinn machen, wenn das CMS auch innerhalb einer entsprechend großen Nutzergruppe eingesetzt wird. In den meisten Fällen ist es ausreichend, Rollen zu definieren und diese mit einem Rechteset zu versehen. Ein Beispiel einer solchen Struktur, zeigt die folgende Grafik

<img src="http://pc-anfaenger.de/php/php_1301.gif" border="0" alt="">

:-) für solche Problemstellungen benutze ich sehr gern Bitoperatoren. Das heißt, ich erspare mir jegliche Zuordnungstabellen. Rechte und Rollen erhalten einen Integerwert (eine Potenz von 2) zugeordnet. Die einer Rolle zugeordneten  Rechte bzw. einem Nutzer zugeordneten Rollen berechnen sich aus der Summe dieser Werte (im Beispiel als bitmask bezeichnet). Die meisten Datenbanken (auf jeden Fall MySQL) unterstützen Bitoperatoren, so dass die Abfrage sehr einfach und sehr schnell geschehen kann.

Deinem Posting entnehme ich, dass du noch nicht allzuviel Erfahrungen im CMS-Bereich hast. Tatsächlich wird die Rechteverwaltung in einem CMS meist überbewertet. Ich kenne mehrere Beispiele einer CMS-Implementation, wo die ganze Rechteverwaltung buchstäblich ressourcenvernichtend ist, da ein- und derselbe Redakteur alle Rollen wahrnimmt. Der Erfolg und Mißerfolg eines CMS ist immer abhängig von der Zielgruppe, an die sich dein CMS richtet. Als Zielgruppe wird aber nicht die Gruppe der Entwickler verstanden, sondern die Gruppe der Leute, die das CMS benutzen werden. Die Wahl deiner Programmiersprache läßt vermuten, dass du dein CMS für Entwickler schreibst. Aber Entwickler brauchen kein CMS und Entwickler die Perl können werden rar und damit teuer.

An welche Zielgruppe ist dein CMS eigentlich gerichtet? Die Tatsache, dass dir die Möglichkeiten einer Rechteverwaltung gefallen, bedeutet nicht, dass diese Möglichkeiten der Zielgruppe gerecht werden.

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.

Glaub mir, CMS ist mehr als Programmierung. CMS ist vorallem und in erster Linie ein Verstehen von Prozessen, Redaktionsprozesse und Programmierprozesse. Wie gut bist du mit Redaktionsprozessen vertraut? Spiele mal gedanklich nach, welche Prozesse ablaufen, wenn beispielsweise unsere Regierung die Quote der Arbeitslosen veröffentlicht und übertrage diese Erkenntnisse auf den normalen Anwendungsfall. Ein Handwerker ändert den Preis eines Produktes und eine Firma, wie beispielsweise Quelle, ändert den Preis für ein Produkt.

Als Datenbanken möchte ich sowohl Postgres als auch MySql »» -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.

schlimmer, dein Problem ist, du schreibst ein CMS für Entwickler nicht für den Benutzer, den Redakteur.

Vielleicht war das nicht die Antwort, die du erwartet hast. Ich arbeite seit zwei Jahren ausschließlich im Bereich CMS-Entwicklung. Und sehr schnell lernte ich, dass die Arbeit des Redakteurs der Mittelpunkt einer CMS-Anwendung ist. Das ist auch ok so, denn der Redakteur arbeitet tagtäglich mit dem CMS-Produkt, der Entwickler nur während der Zeit der Implementierung.

Viele Grüße

Antje