Ich gebe dem vorgeschlagenen Verfahren mal seinen Namen: Access Control Lists (ACLs). ACLs finden sich in allen ernstzunehmenden Betriebssystemen und sind gar nicht mal so schwer.
Mog hat das ganz gut beschrieben; ich füge dem noch mal als Gedankenexperiment hinzu, daß man ein System aufbauen könnte, in dem alles und jeder eine ACL haben kann.
Dazu wird so ziemlich alles, was es im System gibt (User, Usergruppen, Blogeinträge, sogar ACLs) in einer zentralen Objekttabelle verzeichnet (hauptsächlich, damit alle Objekte eine ID im selbenden fortlaufenden Nummernbereich haben). Die ACLs weisen dann einfach beliebigen Objekten auf beliebigen anderen Objekten Rechte zu.
Ach ja; die Objekte sollten hierarchisch organisiert sein, damit Rechtevererbung möglich ist. So kann man Standardregeln festlegen, indem man einfach die ACLs das Wurzelelement referenzieren läßt.
Die zentrale tabelle folgt in Pseudocode. "#" bezeichnet Kommentare.
Man verzeihe mir, daß ich vermutlich die Indizes falsch gesetzt habe und Fremdschlüssel gar nicht verwende; Datenbanken habe ich nie formell gelernt, weil der Kurs zeitlich blöde aufwändig ist.
Zuerst mal hat man eine Tabelle, die die ACL-Einträge beinhaltet:
Der Eintrag 300, 10, 35, read, 0 würde also bedeuten, daß die ACL mit der Objektnummer 300 dem Objekt 35 erlaubt, auf Objekt 10 die Aktion read durchzuführen.
Wenn man den Rest des Systems um diese Tabelle herum konstruiert, ist man bezüglich der Rechtevergabe nur durch das beschränkt, was man in das User Interface einbaut. Man kann theoretisch einzelnen Usern Rechte in Bezug auf einzelne Posts geben und nehmen und niederen Administratoren verbieten, an bestimmten Einstellungen herumzufummeln. Man könnte sogar bestimmten Teilen der Website den Zugriff auf bestimmte andere Teile untersagen.
Allerdings hat mein System einige Nachteile:
- Es ist nicht so extrem übersichtlich. Da alle Objekte in der selben Tabelle erfaßt sind muß man irgendwoanders die ganzen Metadaten oranisieren. Außerdem kann man nicht mehr anhand des id-Feldes erkennen, der wievielte Post ein Post nun ist, etc.
- Es ist auch nicht so extrem performant. Die Objekttabelle wird sehr schnell anwachsen, da jeder Scheiß da eingetragen wird.
- Außerdem muß die Seite haufenweise Datenbankanfragen stellen, um in Erfahrung zu bringen, was ein Objekt nun darf und was nicht. Vielleicht könnte man da mit stored procedures was reißen, aber so oder so bleibt einiger Overhead.
- Nicht zu vergessen, daß man die ganzen Abfragen auch alle coden muß.
Ist eben nur ein kleines Gedankenexperiment, um zu sehen, wie man ACLs auf die Spitze treiben kann.
Warum speicherst du die ganze Menge, ohwohl eine Untermenge ausreicht? Warum hast du zwei Flags fuer ein und den selben Status?
...
Habe ich nicht. Das Flag verbieten hat eine höhrere Priorität als das Flag "Nein".
Wenn in einer Gruppe gesagt wird du darfst das in einer anderen du darfst es nicht darfst du es trotzdem.
Wird es hingegen verboten darfst du es wirklich nicht.
Ich habe es ja am Beispiel des Azubis versucht zu verdeutlichen. Ein Azubi in der Probezeit soll z.B. nicht direkt die Möglichkeit haben Artikel auf der Seite zu veröffentlichen, er darf aber neue Artikel anlegen und vieles mehr.
Würde ich sagen es gibt nur Ja und Nein müsste ich 2 Gruppen alle Berechtigungen zuweisen.
Bei meinem Vorgehen benötige ich zwar auch zwei Gruppen, nur brauche ich der Gruppe "Probezeit" nur eine Berechtigung zuweisen und zwar: "Veröffentlichen verbieten".
Diese Tabelle hat jetzt zwar echt etwas overhead nämlich das Feld record_class dieser ergibt sich aber durch das zugrunde liegende ORM und wird eig. erst wichtig wenn ich die Klasse Permission noch einmal ableiten würde.
Habe ich nicht. Das Flag verbieten hat eine höhrere Priorität als das Flag "Nein".
Wenn in einer Gruppe gesagt wird du darfst das in einer anderen du darfst es nicht darfst du es trotzdem.
Wird es hingegen verboten darfst du es wirklich nicht.
...
Mit anderen Worten: "Nein" bedeutet "hat keine Erlaubnis". "Verboten" bedeutet "darf nicht, auch wenn er eine Erlaubnis hat". Das macht Sinn, weil ACLs in der Regel hierarchisch arbeiten, ein Objekt also die ACLs seiner Elternobjekte erbt. Ich kann also für das Elternobjekt eine Erlaubnis haben und für das Kindobjekt nicht – damit würde ich im Kindobjekt trotzdem Zugriff kriegen, sofern es nicht verboten wird.
Dabei "überstimmen" normalerweise Kinder- die Elternobjekte. Nehmen wir folgendes Szenario:
Dann sehen meine Rechte so aus:
- Foo: Ich kann zugreifen.
- Quux: Ich kann zugreifen.
- Bar: Ich kann nicht zugreifen.
- Baz: Ich kann (theoretisch) zugreifen. Ich kann zwar nicht über Bar hinnavigieren, Direktzugriff könnte aber gehen.
- Blubb: Ich kann nicht zugreifen.
Falls man auf Objekte nur zugreifen kann, wenn man auch an die Elternobjekte kommt, so reicht ein Verbot irgendwo in der Kette der Eltern, damit ich keinen Zugriff mehr habe.