Andres Freund: Datenbankmodellierung einer Rechteverwaltung

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

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

    1. Hi Antje,

      Hallo Andreas,

      Nein, Andres ist schon richtig;-)

      Erstmal, muss ich glaube ich noch mal genauer beschreiben was ich eigentlich will, uns aus welcher Situation ich das mache:
      Ich habe keine Firma, sondern bin noch Schüler und mache noch "nebenher" Hompages.
      Der Begriff CMS ist vielleicht auch nicht ganz glücklich gewählt, da das eine Art Komplettsystem werden soll. Das heißt damit wird nicht "nur" der Inhalt verwaltet, sondern es ist auch ein, ich weiß nicht wie ich das jetzt genau erklären soll, Comunity System. Damit meine ich, dass das ganze nicht nur Möglichkeiten zu Veröffnetlichung, sondern auch Sachen wie Möglichkeiten wie Umfragen, Komentare zu Artikeln (evtl. weil es oft gewünscht wird, Instant Messaging (volkommen blöder Begriff)) und vor allem eine standarisierte Schnittstelle für Plugins. D.H. falls ich eine neue Funktion brauche, kann ich "einfach" die Datei mit der Funktion in ein bestimmtes Verzeichniss kopieren, und dann im Admin-Menue aktivieren.

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

      Das stimmt absolut, bisher hatte ich ein nach und nach gewachsenes System, das war am Ende nur noch einziges Durcheinander.

      Deinem Posting entnehme ich, dass du noch nicht allzuviel Erfahrungen im CMS-Bereich hast.

      Stimmt.

      Tatsächlich wird die Rechteverwaltung in einem CMS meist überbewertet.

      Kann sein, da habe ich keine Erfahrung, aber wenn zum Beispiel eine größere (was noch zu definieren ist) Gruppe (wie in meinem beispiel eine kleinere Umweltorganisation), die sich fast nur über das Internet kennen, eine Website hat, ist das schon praktisch.

      Ich kenne mehrere Beispiele einer CMS-Implementation, wo die ganze Rechteverwaltung buchstäblich ressourcenvernichtend ist, da ein- und derselbe Redakteur alle Rollen wahrnimmt.

      Dann steckt man ihn in eine Rolle, oder wie ich gesagt hätte Gruppe, die das alles darf. So wie ich das ganze machen möchte, kann ich mir nicht vorstellen, das das besonders recourcefressend ist. Das ist eine einzige Datenabfrage über eine schon existierende Verbindung zu einer Datenbank.

      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.

      Das ist klar das sich die benötigten Features immer Unterscheiden. Aber ich möchte das ganze so schreiben, das das ganze möglichst universell einsetzbar ist und bei zusätzlichen benötigten Features einfach ein Plugin eingebunden werden kann.

      Die Wahl deiner Programmiersprache läßt vermuten, dass du dein CMS für Entwickler schreibst.

      Was hat die Wahl der Programmiersprache mit den Kunden zu tuen? Die User die das benutzen werden, bekommen nicht ein einziges Stück davon zu sehen(bis auf die Dateiendung eventuell)? Man kann ein CMS doch in jeder beliebigen Sprache schreiben, oder?

      Aber Entwickler brauchen kein CMS und Entwickler die Perl können werden rar und damit teuer.

      Warum brauchen Entwickler kein CMS? Gerade im OpenSource bereich, wo die einzelnen Entwickler oft weit entfernt wohnen, ist ein CMS doch nützlich.

      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.

      Keine spezielle Zielgruppe, ich möchte das CMS so allgemein wie möglich halten, so dass ich es möglichst oft benutzen kann.
      Eine spezielle wäre allerdings eine Gruppe von Umweltschüttzern, die Artikel über Umweltschutz veröffentlichen.

      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.

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

      Häh, da komme ich jetzt nicht ganz klar mit. Diese Id kommt doch nur in irgendwelchen Abfragen vor, das hat mit dem User doch gar nichts zu tuen, oder? Das einzige wo er es sehen könnte, wäre in einer Url.

      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.

      Es war nicht ganz die Antwort die ich erwartet habe, aber sie ist dennoch _sehr_ hilfreich.

      mfg Andres Freund