Erste Schritte mit der Joomla! ACL
Dieser Artikel ist ein Follow-up des Grundlagenartikels über die Joomla! Access Control List (ACL).
Die Joomla! ACL - ein praktisches Beispiel
Es wird dringend empfohlen, zuerst den ersten Teil zu lesen, bevor hier fortgefahren wird. Die Terminologie und die Zusammenhänge zwischen den einzelnen Aspekten der ACL werden im ersten Teil ausführlich diskutiert und hier nicht wiederholt.
In diesem Teil wird ein einfaches System von Berechtigungen aufgesetzt. Es handelt sich um die fiktive Seite eines Anbieters von Joomla! Kursen. Auf der Seite haben Besucher, Kursteilnehmer und Instruktoren Zugriff auf verschiedene Bereiche.
- Besucher sollen ausschliesslich das Kursangebot sehen.
- Kursteilnehmer haben zusätzlich Zugriff auf ihr Lernmaterial.
- Instruktoren haben Zugriff die öffentlichen Seiten, auf das Lernmaterial sowie auf einen Bereich, der ausschliesslich für sie vorgesehen ist.
- Super User haben via Backend selbstverständlich Zugriff auf sämtliche Inhalte der Seite.
Bemerkung: Wir reden hier ausschliesslich über das Betrachten, nicht über das Erstellen oder Editieren von Inhalten. Somit sind die verwendeten Zugriffsebenen (was man sieht) der Schlüssel zum Problem.
Wir reden aber auch über drei verschiedene Gruppen: Public (= öffentlich), Kursteilnehmer, Instruktoren ( zusätzlich kommen am Rand noch Super Users ind Spiel). Die erste und die letzte Gruppe existieren bereits, die lassen wir so stehen, die beiden mittleren müssen wir zunächst neu erstellen. Beide brauchen nur ein einziges der globalen Rechte: Das Recht, sich in das Frontend der Seite einloggen zu können, um mehr Inhalte zu sehen. Damit sind eigentlich sowohl Instruktoren als auch Kursteilnehmer im Grunde genommen nichts anderes als Registrierte Benutzer.
Unsere Zugriffsebenen müssen wir natürlich so einstellen, dass ein Kursteilnehmer nur für ihn bestimmtes Material zu Gesicht bekommt, ein Instruktor aber auch und zusätzlich dasjenige, welches für seine Gruppe bestimmt ist.
Es geht los
- Wir erstellen zwei neue Gruppen und nennen diese Instruktoren und Kursteilnehmer.
- Wir konfigurieren die globalen (=Kern-) Berechtigungen für die beiden Gruppen.
- Wir erstellen - zu Testzwecken - Benutzer, die wir den beiden Gruppen zuordnen.
- Wir erstellen eine Zugriffsebe für Instruktoren und eine andere für Kursteilnehmer.
- Wir erstellen Kategorien für Instruktoren sowie für Kursteilnehmer und setzen dafür die jeweils entsprechenden Zugriffsebenen.
- Wir schreiben Beiträge für die beiden neuen Kategorien.
- Wir erstellen Menüeinträge für die Instruktoren und Kursteilnehmer und setzen für die Einträge die entsprechenden Zugriffsebenen.
- Wir prüfen per Login, ob die Zugriffsebenen überall richtig gesetzt sind.
1. Gruppen erstellen
Im Backend gehen wir zu Benutzer => Gruppen und erstellen die beiden neuen Gruppen für die Instruktoren und Kursteilnehmer und speichern diese.
Als übergeordnete Gruppe wählen wir die öffentliche Gruppe 'Public'. Damit liegen die beiden Gruppen direkt unter der Wurzelgruppe. Da die beiden neuen Gruppen ausschliesslich die Berechtigung erhalten sollen, sich ins Frontend einzuloggen, hätten wir ja 'Registered' als übergeordnete Gruppe wählen können. Das machen wir aber bewusst nicht. Der Grund liegt darin, dass wenn wir an dieser Stelle bereits damit anfangen, Berechtigungen zu vererben, die ganze Geschichte sehr schnell unübersichtlich wird und damit leicht Fehler passieren. Die neuen Gruppen direkt unter der Wurzel anzulegen, heisst nichts anderes, als dass wir die absolute Kontrolle über die Berechtigungen der beiden Gruppen in der Hand behalten, es wird nichts von oben vererbt. Alles würde zwar in diesem Beispiel wie gewünscht funktionieren, wenn wir die Gruppen als Kinder von 'Registered' anlegen würden. So ist es aber definitiv einfacher za handeln, wenn wir später komplexere Rechte vergeben möchten.
2. Globale Berechtigungen
Wir setzen für die beiden Gruppen die globalen Berechtigungen. Diese sind identisch für beide Gruppen, sie sind ebenfalls identisch mit den Berechtigungen der Gruppe 'Registered'.
Konfiguration => Berechtigungen
Die Seitenanmeldung setzen wir auf 'Erlaubt'. Alle anderen Einstellungen belassen wir auf 'Verebt'.
3. Neue Benutzer erstellen und den Gruppen zuordnen
Nun erstellen wir im Backend unter Benutzer => Neu je einen Benutzer für die Gruppe Instruktoren und die Gruppe Kursteilnehmer. Die E-Mail Adressen erfinden wir, z.B. user1 @ example.com, user2 @ example.com. Defaultmässig ist bei neuen Benutzern 'Registered' ausgewählt. Das lassen wir so, zusätzlich ordnen wir die Benutzer aber auch der jeweils passenden Gruppe zu. Wieso das denn? kann man sich an dieser Stelle fragen. Der Grund ist der: Manchmal möchte man sich Informationen über alle Benutzer ansehen, wenn alle Benutzer auch Mitglieder der Gruppe 'Registered' sind, ist dies bedeutend einfacher. Zudem kann für eingeloggte Benutzer so einfacher ein Usermenü gezeigt werden.
4. Zugriffsbenen erstellen
Nachdem wir unsere Gruppen, Kernberechtigungen und Benutzer erstellt haben, bleibt das Erstellen von Zugriffsebenen. Wir gehen zu Benutzer => Zugriffsebenen => Neu und erstellen je eine Zugriffsebene für Kursteilnehmer und für Instruktoren. Bei den Kursteilnehmern setzen wir die zugriffsberechtigte Gruppe auf Kursteilnehmer, bei den Instruktoren auf Instruktoren und auf Kursteilnehmer. Die Kursteilnehmer sehen somit nur für die eigene Gruppe gedachte Inhalte, die Instruktoren jedoch nebst den eigenen auch die Inhalte für die Kursteilnehmer. Das mag auf den ersten Blick gerade verkehrt herum aussehen, ist aber richtig, wenn man bedenkt, dass hier der Zugriff auf Inhalte, nicht Gruppen konfiguriert werden. Wieso nicht 'Registered' ebenfalls im Zugriff ist? Ganz einfach: das würde dazu führen, dass jeder Benutzer der Gruppe 'Registered' ebenfalls auf die Inhalte der beiden Gruppen zugreifen könnte. Genau dies möchten wir aber vermeiden. Die Gruppe 'Super users' haben wir ebenfalls ausgeschlossen. Damit bekommt ein Super user ebenfalls keine Inhalte der beiden Gruppen zu Gesicht, wenn er sich ins Frontend der Seite einloggt. Wohl aber im Backend, da hat er den vollen Zugriff.
5. Kategorien erstellen
Wir legen nun zwei neue Inhaltskategorien an und gehen dazu auf Inhalt => Kategorien => Neu, eine Kategorie für die Kursteilnehmer und eine weitere für die Instruktoren. Die Zugriffsebenen werden hier so gesetzt, dass sie zu den entsprechenden Ebenen passen, also für Instruktoren => Instruktoren und für Kursteilnehmer => Kursteilnehmer. Natürlich würden wir dasselbe erreichen, wenn wir die Zugrifffsebene in jedem einzelnen Artikel setzen würden, das wäre aber zum Einen extrem aufwendig, zum Andern passieren so sicher Fehler.
6. Beiträge schreiben
Wir verfassen jetzt ein bis zwei Beiträge für die Kategorie Kursteilnehmer und dasselbe für die Kategorie Instruktoren. Dabei beachten wir, dass die Kategorie richtig gesetzt ist.
Im Prinzip kann die Zugriffsebe hier auf Public stehen gelassen werden, weil wir ja den Zugriff mit den Kategorien geregelt haben. Wer ein gerütteltes Mass an Paranoia mitbringt, darf hier aber selbstverständlich auch noch den Zugriff beschränken. Immerhin ist es so, dass wenn nach ein paar Monaten an Gruppen und Ebenen herumeditiert wird, kann es versehentlich passieren, dass der Zugriff auf Inhalte plötzlich doch wieder für Benutzer möglich ist, die wir eigentlich ausgesperrt haben wollten. Ein bisschen paranoid, aber durchaus nicht verboten. Und, wie gesagt, so passieren mehr Fehler.
7. Menü-Einträge erstellen
Bevor wir die ganze Geschichte jetzt ausprobieren können, bauen wir uns noch je einen Menüeintrag für die Instruktoren und für die Kursteilnehmer. Wr benennen die Einträge sinnvoll, z.B Instruktoren und Kursteilnehmer, als Typ kommt beispielsweise eine Kategorieliste oder ein Kategorieblog infrage, dazu selektieren wir dann die jeweils passende Kategorie und - ganz wichtig - setzen für die Menüpunkte ebenfalls die dazu passende Zugriffsebene. Und das wars auch schon, wir dürfen unser Werk testen..
8. Login und Zugriff testen
Wir gönnen uns eine kleine Verschnaufpause und melden uns dann einmal als Instruktor und einmal als Kursteilnehmer im Frontend der Seite an. Sofern wir nirgens einen Fehler gemacht haben, muss der Kursteilnehmer im Menü den zusätzlichen Punkt Kursteilnehmer sehen, beim Draufklicken muss die entsprechende Kategorieliste sichtbar werden.
Beim Instruktor zeigt sich sowohl der Menüpunkt für die Kursteilnehmer, als auch der Menüpunkt für die Instruktoren. Beide Menüpunkte müssen den Zugriff auf die entsprechenden Kategorielisten öffnen.
Spasseshalber eröffnen wir jetzt noch einen zusätzlichen Benutzer und ordnen diesem nur die Gruppe 'Registered' zu. Was wohl sieht dieser Benutzer nach dem Einloggen?
Er sieht denselben Inhalt, wie ein nicht eingeloggter Besucher; weder ein zusätzliches Menü, noch zusätzliche Beiträge, der Zugriff darauf bleibt ihm verwehrt. Selbst wenn die Adresse eines 'verbotenen' Artikels bekannt ist, sieht der tränende Benutzer nur eine schnöde Fehlermeldung, die ihn darauf hinweist, dass er auf diese Ressource leider keinen Zugriff hat.
Schlussbemerkung
Dieser Artikel basiert in Teilen auf diesem Artikel im JCM Februar 2012, welcher von Jen Kramer geschrieben wurde. Er wurde von Chris Hoefliger übersetzt, überarbeitet, ergänzt und an Joomla! 3.x angepasst. Jen hat freundlicherweise erlaubt, diesen Artikel hier und in dieser Form zu publizieren. Jen hat noch zwei weiterführende Artikel zum Thema ACL geschrieben. Wenn also Interesse besteht, alle Artikel zum Thema sind hier aufgelistet.