Rollenmatrix
Die vollständige Aufstellung dessen, was jede Rolle dieses Wikis erlaubt und was sie nicht erlaubt, Ebene für Ebene. Diese Seite ist die eine Quelle für Berechtigungswerte; alle anderen Seiten verweisen hierher, statt Werte zu wiederholen.
Geltungsbereich
| Ebene | Vergibt | Gespeichert in | Ausgewertet von |
|---|---|---|---|
| 1 DokuWiki-ACL | Zahlen 0–255 je Seite oder Namensraum | conf/acl.auth.php | DokuWiki-Kern |
| 2 Sitzungsnachweis | AUTHENTICATED, MAIL_OTP, TOTP, MFA_ANY | conf/wkidentity-policy.json | wkidentity |
| 3 Projektrolle | none, reader, contributor, maintainer, admin | Gruppen in der Benutzerverwaltung | wkdocore |
| 4 Komponentenstufen | je Komponente verschieden | ACL bzw. eigene Richtliniendatei | die jeweilige Komponente |
Die Ebenen werden in dieser Reihenfolge gefragt, und jede darf nur noch abweisen. Eine Rolle auf Ebene 3 kann nicht erteilen, was Ebene 1 verweigert hat.
Ebene 1: Die DokuWiki-ACL
Die Grundleiter. Sie gilt für jede Seite und jeden Namensraum und ist die einzige Ebene, die auch ohne jede Komponente dieses Hauses arbeitet.
Die Leiter
| Wert | Name | Erlaubt | Erlaubt nicht |
|---|---|---|---|
| 0 | Kein Zugriff | nichts; die Seite verhält sich, als gäbe es sie nicht | jeden Lesezugriff, auch auf Anhänge und Feeds |
| 1 | Lesen | Seite ansehen, Verlauf und Unterschiede, Export, Abonnement | jede Änderung, auch das Anlegen einer Unterseite |
| 2 | Bearbeiten | zusätzlich: bestehende Seiten ändern, Entwürfe, Zurückrollen | neue Seiten anlegen, Dateien hochladen |
| 4 | Anlegen | zusätzlich: neue Seiten im Namensraum anlegen | Dateien hochladen, Dateien löschen |
| 8 | Hochladen | zusätzlich: Dateien in den Medienbereich legen | hochgeladene Dateien wieder löschen |
| 16 | Löschen | zusätzlich: Dateien im Medienbereich löschen | Konfiguration, Benutzerverwaltung, Erweiterungen |
| 255 | Administration | alles, unter Umgehung sämtlicher ACL-Regeln | — |
Wie ein Wert zustande kommt
DokuWiki wertet die spezifischste Regel aus, nicht die höchste. Reihenfolge:
- Regel für dieses Konto auf dieser Seite.
- Regel für eine Gruppe dieses Kontos auf dieser Seite — bei mehreren gewinnt die höchste.
- Dieselben beiden Schritte im nächsthöheren Namensraum, aufwärts bis zur Wurzel.
- Trifft nichts zu: kein Zugriff.
Eine Kontoregel schlägt jede Gruppenregel derselben Ebene, auch wenn sie niedriger ist. So sperrt man ein einzelnes Konto aus einem Bereich aus, den seine Gruppe offen hat.
Gruppen dieses Wikis
| Gruppe | Wer darin ist | Bedeutung |
|---|---|---|
@ALL | jede Besucherin und jeder Besucher, auch ohne Anmeldung | der Grundwert; steht er auf 0, ist der Bereich nicht öffentlich |
@user | jedes angemeldete Konto | „angemeldet genügt„ |
@admin | die Superadministration ($conf['superuser']) | umgeht Ebene 1 vollständig |
@wvds | redaktionell Mitwirkende | Schreibrechte auf den Sprach- und Inhaltsnamensräumen |
@wvdse | technische Betreuung der Quellcode-Mounts | Vollzugriff auf die eingehängten Repositorien |
@dwdo_<projekt>_readers | Leserinnen und Leser eines Projekts | siehe Ebene 3 |
@dwdo_<projekt>_contributors | Mitwirkende eines Projekts | siehe Ebene 3 |
@dwdo_<projekt>_maintainers | Betreuung eines Projekts | siehe Ebene 3 |
Ebene 2: Der Sitzungsnachweis
Diese Ebene fragt nicht, wer Sie sind, sondern wie gut diese eine Sitzung das belegt hat. Sie ist der häufigste Grund dafür, angemeldet zu sein und trotzdem abgewiesen zu werden.
| Stufe | Bedeutet | Erreicht durch | Reicht nicht für |
|---|---|---|---|
AUTHENTICATED | angemeldet, Passwort genügt | gewöhnliche Anmeldung | Bereiche mit Faktorpflicht |
MAIL_OTP | Einmalcode per E-Mail bestätigt | Code aus der E-Mail eingegeben | Bereiche, die ausdrücklich TOTP verlangen |
TOTP | Authenticator-App bestätigt | sechsstelliger Code aus der App | — |
MFA_ANY | irgendein zweiter Faktor bestätigt | MAIL_OTP oder TOTP | — |
Woran eine Anforderung hängen kann
Eine Anforderung wird an einen Geltungsbereich gebunden. Möglich sind acht Arten:
namespace— alle Seiten unter einem Präfix.plugin,module,view— eine Komponente, ein Modul darin, eine einzelne Ansicht.command,adminAction— ein Befehl bzw. eine Verwaltungshandlung.group,user— an die anfragende Person gebunden statt an das Ziel: „diese Gruppe braucht immer TOTP“.
Treffen mehrere zu, gilt die höchste. Eine Sitzung, die MAIL_OTP nachgewiesen hat, erfüllt MFA_ANY und MAIL_OTP, nicht aber TOTP.
Die drei älteren Listen
| Liste | Wirkung | Blockiert? |
|---|---|---|
required_users | Profilseite und ein Hinweisband mahnen zur Einrichtung | nein, nur Hinweis |
email_users | dürfen den E-Mail-Code benutzen, auch wenn er allgemein aus ist | nein, erweitert nur |
required_namespaces | Lesen und Schreiben werden verweigert, solange kein Faktor eingerichtet ist | ja |
email_users kann eine Methode nur hinzufügen, niemals wegnehmen. Eine fehlende oder unlesbare Richtliniendatei kann daher niemand aussperren.
Ebene 3: Die Projektrolle
Innerhalb eines Projekts gilt eine eigene, geordnete Leiter. Sie steuert, welche Arbeitsbereiche in der Navigation erscheinen und wer die Mitgliederliste eines Projekts ändern darf.
| Rolle | Stufe | Erlaubt | Erlaubt nicht |
|---|---|---|---|
none | 0 | nichts | jeden Projektbereich |
reader | 10 | Projektbereiche und Arbeitsbereiche ansehen | Inhalte ändern, Mitglieder sehen |
contributor | 20 | zusätzlich: Inhalte des Projekts anlegen und ändern | Mitglieder verwalten, Einstellungen ändern |
maintainer | 30 | zusätzlich: Mitglieder verwalten, Projekteinstellungen | Maintainer ernennen, globale Konfiguration |
admin | 40 | alles | — |
admin ist die globale Superadministration des Wikis, keine projektbezogene Rolle. Ein projektbezogenes Administrationsrecht gibt es nicht: Die höchste Rolle, die man in einem Projekt haben kann, ist maintainer. Wer Maintainer ernennt, ist die globale Administration.
Woher die Rolle kommt
Zuerst der Gruppenüberzug, dann die ACL. Der erste Treffer gewinnt:
- Superadministration →
admin. - Mitglied in
@dwdo_<projekt>_maintainers→maintainer. - Mitglied in
@dwdo_<projekt>_contributors→contributor. - Mitglied in
@dwdo_<projekt>_readers→reader. - Sonst: ACL-Wert auf der Projektwurzel übersetzen — ab 16 →
maintainer, ab 2 →contributor, ab 1 →reader, sonstnone.
Das Präfix dwdo_ ist einstellbar (roleprefix). Die Rolle wird immer an der Projektwurzel bestimmt, nie an der Seite, die Sie gerade ansehen — sie ist eine Eigenschaft des Projekts, nicht des Aufrufs.
Was die Navigation verbirgt
Arbeitsbereiche, für die die Rolle nicht genügt, werden in der Navigationsleiste ausgeblendet. Das ist eine Anzeigeentscheidung, keine Absicherung: Die Zielseite prüft ihre Berechtigung selbst. Ein verschwundener Menüpunkt bedeutet daher „hier ist für Sie nichts zu holen„, nicht „hier liegt etwas Verstecktes“.
Ebene 4: Die Komponentenstufen
Einzelne Komponenten führen zusätzlich eine eigene Leiter, weil ihr Gegenstand keine Wiki-Seite ist.
Eingehängte Quellcode-Repositorien
Vier Sprossen einer Leiter, ausgedrückt in denselben Zahlen wie Ebene 1 — es gibt also keine zweite Berechtigungsverwaltung, sondern eine ACL-Zeile je Gruppe auf dem Einhängepunkt.
| Fähigkeit | ACL-Wert | Erlaubt | Erlaubt nicht |
|---|---|---|---|
view | 1 | im Wiki blättern und ansehen | klonen, herunterladen |
fetch | 2 | zusätzlich: klonen und als Archiv laden | eigene Änderungen ablegen |
propose | 4 | zusätzlich: unter eigenem Ref-Präfix ablegen | in fremde Zweige schreiben |
write | 8 | zusätzlich: überall schreiben, wo das Repositorium es zulässt | Einhängepunkte verwalten |
Für neue Einhängepunkte gibt es vier Voreinstellungen:
| Stufe | Wer sieht es | Wer schreibt |
|---|---|---|
private | niemand außer der technischen Betreuung | technische Betreuung |
readonly | jedes angemeldete Konto (fetch) | technische Betreuung |
public | alle, auch ohne Anmeldung (fetch) | technische Betreuung |
team | die Leser des Projekts (view) | Mitwirkende fetch, Maintainer write |
team ist die einzige Stufe, deren Gruppen vom Projekt abhängen. Sie ist die richtige Wahl, sobald mehrere geschlossene Projekte nebeneinander bestehen: Die anderen drei kennen nur „niemand„, „alle Angemeldeten“ und „alle„.
SQLite Data Studio
Eine Fähigkeitsmatrix statt einer Leiter, weil die sechs Fähigkeiten wirklich unabhängig sind.
| Fähigkeit | Erlaubt |
|---|---|
use | das Studio überhaupt öffnen |
query | lesende Abfragen ausführen |
write | Daten ändern |
design | Schema ändern |
export | Ergebnisse ausleiten |
admin | Verbindungen und die Matrix selbst verwalten |
Die Auflösung, erster Treffer gewinnt:
- Superadministration → immer erlaubt.
- Steht
dbadmin_readonlyauf 1, sindwriteunddesignverweigert — auch dort, wo die Matrix sie erteilt. - Regel für die Verbindung schlägt globale Regel; innerhalb einer Ebene schlägt eine Kontoregel jede Gruppenregel. Gruppenregeln derselben Ebene werden vereinigt.
- Keine passende Regel → verweigert.
Handlungen mit Faktorpflicht
Mehrere Komponenten verlangen für einzelne Handlungen zusätzlich einen Sitzungsnachweis nach Ebene 2, unabhängig davon, welche Berechtigung das Konto hat.
| Komponente | Handlung | Verlangt |
|---|---|---|
| Tresor | read | AUTHENTICATED |
| Tresor | create, rotate, delete, rekey | MFA_ANY |
| SQLite Data Studio | code-write, connection-admin, db-destructive | MFA_ANY |
| Ressourcen | create, update | AUTHENTICATED |
| Ressourcen | delete | MFA_ANY |
| Azure-DevOps-Anbindung | secret-write, remove | MFA_ANY |
| Quellcode-Einhängepunkte | token-issue | AUTHENTICATED |
| Quellcode-Einhängepunkte | mount-admin | MFA_ANY |
| Blog | content-admin | MFA_ANY |
Wer pflegt was
| Ebene | Bildschirm | Wer darf dorthin |
|---|---|---|
| 1 ACL | ?do=admin → Zugriffsverwaltung | Superadministration |
| 1 Gruppen eines Kontos | ?do=admin → Benutzerverwaltung | Superadministration |
| 2 Sitzungsnachweis | ?do=admin → Identität | Superadministration |
| 3 Projektmitglieder | Projektseite → Mitglieder | Maintainer des Projekts |
| 4 Einhängestufen | ?do=admin → Quellcode-Einhängepunkte | Superadministration |
| 4 Fähigkeitsmatrix | ?do=admin → SQLite Data Studio → Berechtigungen | wer admin im Studio hält |
Der Mitgliederbildschirm eines Projekts ist der einzige, den keine globale Administration braucht. Er ist deshalb der Zielort, an den eine Zugriffsanfrage zu einem Projekt geleitet wird — siehe Wohin eine Anfrage geht.
Der Vertrag für Komponenten
Eine eigene Komponente hängt ihre Absage an dieselbe Infrastruktur, statt einen eigenen Satz zu schreiben. Zwei Aufrufe genügen.
Eine Absage wegen fehlender Berechtigung:
$req = plugin_load('helper', 'wkrequest'); if (is_object($req) && method_exists($req, 'accessPanel')) { echo $req->accessPanel([ 'resourceLabel' => $titel, 'required' => $req->permissionLabel(AUTH_READ), 'current' => $req->currentPermissionLabel($seitenId), 'draft' => [ 'type' => 'ACCESS_REQUEST', 'owner' => 'meinplugin', 'handler' => 'meinplugin:einstellungen', 'resource' => $seitenId, ], 'alternatives' => [['label' => $andererWeg, 'href' => $url]], ]); }
Eine Absage wegen fehlendem zweitem Faktor:
echo $req->stepUpPanel([ 'requirement' => 'MFA_ANY', 'origin' => 'meinplugin:loeschen', 'back' => $zurueckUrl, ]);
Anmeldung, „meine offenen Anfragen“ und der Rückweg werden angehängt, ohne dass die aufrufende Stelle daran denken muss; jeder dieser Punkte meldet sich in der Lage, in die er nicht passt, selbst als nicht verfügbar und wird dann weggelassen.
Damit eine Anfrage bei der richtigen Stelle landet, meldet die Komponente ihren Verwaltungsbildschirm an:
$controller->register_hook('WKREQUEST_REGISTER_HANDLERS', 'BEFORE', $this, 'registerRequestHandlers'); // ... $event->data['handlers'][] = [ 'owner' => 'meinplugin', 'id' => 'einstellungen', 'label' => $this->getLang('menu'), 'url' => wl('', ['do' => 'admin', 'page' => 'meinplugin'], true, '&'), 'types' => ['ACCESS_REQUEST', 'ADMIN_ACTION_REQUEST'], ];
Kennt eine Komponente den abgewiesenen Bereich genauer als der Kern, schärft sie die Tafel nach, statt eine zweite daneben zu zeichnen:
$controller->register_hook('WKREQUEST_REFINE_DENIED', 'BEFORE', $this, 'refineDeniedRequest');
$event->data trägt dann id, resourceLabel, required, current, facts, alternatives und draft. Zurückgegebene Werte werden einzeln übernommen; ein unbrauchbarer Wert wird verworfen und die allgemeine Antwort bleibt stehen.
Bekannte Lücken
Stellen, an denen das Modell heute weniger leistet, als der Rest dieser Seite nahelegt. Sie stehen hier, weil eine Lücke, die niemand benennt, wie ein Fehler des Lesers aussieht.
| Lücke | Folge | Behelf |
|---|---|---|
| Meldungen nach einer versuchten Handlung sind weiterhin einzeilige Hinweise, keine Tafeln. Das betrifft unter anderem die Git-Ansicht, Pipelines, Arbeitsaufgaben und die Quelltextanzeige. | Nach einem fehlgeschlagenen Klick steht dort „Sie dürfen das nicht„ ohne Anforderungsweg. | Die Seite neu laden: Die verschlossene Seite trägt die Tafel. |
| Nur eine Anfrage, die ein Projekt benennt, findet ihre Zuständigen von selbst. Alles Übrige geht an die global eingestellte Adresse — und in dieser Installation ist keine gesetzt. | Eine Anfrage ohne Projektbezug benachrichtigt niemanden. Sie ist gespeichert und im Eingang sichtbar, aber niemand erfährt davon. | Eine Adresse unter notify_mail eintragen, oder den Eingang regelmäßig öffnen. |
@wvds und @wvdse kommen in den ACL-Regeln vor, sind aber derzeit keinem Konto zugeordnet. | Regeln, die nur diese Gruppen öffnen, öffnen für niemanden. | Zuordnung in der Benutzerverwaltung prüfen. |
| Die Projektübersicht, die Ihre Rolle je Projekt auflistet, gibt es bisher nur auf Deutsch. | Wer die Oberfläche in einer anderen Sprache benutzt, findet seine Rollen nur einzeln, auf jeder Projektseite. | Projektübersicht |
Verwandte Themen
- Rollen und Berechtigungen — Einstieg und Wegweiser.
- How to: Zugriff anfordern — der Weg von der Absage zur Anfrage.
- Warum darf ich das nicht? — Symptome und ihre Ursachen.