Artikelbezogene Zugriffsberechtigungen im MediaWiki

Meine erste Lösung zum Thema Zugriffsberechtigungen pro Seite im MediaWiki ist nicht mehr so ganz praktikabel, da nur Admins die Seiten hinzufügen können und das immer im Quelltext des Wikis tun müssen (zumindest in der LocalSettings.php). Daher habe ich jetzt eine kleine Extension programmiert, mit der man mit Tags im Artikel selbst den Zugriff beschränken kann.

Funktionsbeschreibung

  • Anonyme Benutzer dürfen nichts, außer sich anmelden (weitere erlaubte Seiten können einfach hinzugefügt werden).
  • Angemeldete Benutzer dürfen darüberhinaus weitere definierbare Seiten anschauen.
  • Mitglieder definierbarer Gruppen bzw. einzelne Benutzer dürfen alles (explizite Freischaltung im Quelltext der Extension).
  • Angemeldete Benutzer, die weder selbst freigeschaltet, noch in einer der freigeschalteten Gruppen sind, dürfen nur Artikel lesen bzw. ändern, für die es ihnen durch die Tags erlaubt ist.

Technische Umsetzung

  1. Zunächst habe ich mich in der MediaWiki-Dokumentation noch einmal die grundlegende Herangehensweise bei der Programmierung einer Extension angeschaut und die Tags definiert, indem ich die Datei TagsUserPermissions.php im Ordner extensions/ angelegt habe. Diese habe ich dann in der LocalSettings.php inkludiert: include("extensions/TagsUserPermissions.php");
  2. Danach konnte ich nun schon einmal meine selbstdefinierten Tags im Wiki eingeben:
    • LesenBenutzer
    • LesenGruppe
    • AendernBenutzer
    • AendernGruppe
      Die Namen dürften recht sprechend sein, sie sind aber im Quelltext der Extension beliebig änderbar. Die Tags werden in den Artikeln nicht angezeigt, sie sind nur in deren Quelltext sichtbar.
  3. Die eigentliche Arbeit übernimmt nun eine Funktion, die ich als Hook-Funktion dem Event-Handler UserCan zugewiesen habe. Wie das geht, steht in der MediaWiki-Dokumentation. Auf jeden Fall wird die Funktion nun immer dann aufgerufen, wenn intern überprüft wird, ob der aktuelle Benutzer auf der aktuellen Seite eine Aktion (lesen, ändern, verschieben etc.) ausführen darf. Kurz gesagt liest sie per Regular Expressions die Tags aus und prüft die Gruppenzugehörigkeit des aktuellen Benutzers bzw. direkt den Benutzernamen. Die Extension besteht aus einer einzigen Datei zwei Dateien (die Extension und eine SpecialPage, auf der man die vergebenen Berechtigungen einsehen kann), die ich natürlich gerne zum Download anbiete. Ein Klick auf die Dateien öffnet sie auch direkt im Browser (inklusive Syntax-Highlighting). Die SpecialPage muss im Ordner includes/ abgelegt werden.

Über Stefan

Polyglot Clean Code Developer

5 Kommentare

  1. Hallo Stefan!
    Ich versuche seit 24h (ich hab noch wenig geschlafen) genau das in mein mediawiki zu integriergen, was du anscheinend geschafft hast. leider bin ich kein php-guru – könntest du mir das ein bisschen genauer erklären?
    Herzlichen Dank!

  2. Was geht denn bei dir nicht? Kommen irgendwelche Fehlermeldungen?

    Du musst wirklich lediglich die beiden Dateien herunterladen (bzw. den Code in neue Dateien kopieren) und in den jeweiligen Ordnern ablegen. Dann trägst du in die LocalSettings.php die oben genannte Zeile ein und das war’s!

    Dann kannst du über die Tags im Quelltext der Artikel die Zugriffsberechtigungen steuern. Das sähe z.B. so aus, wenn Benutzer “Dieter” den Artikel ändern können soll: <AendernBenutzer>Dieter</AendernBenutzer>

  3. Hallo,

    ich habe mich gerade gefeut deine Lösung zu mediawiki und Userberechtigungen zu finden. Leider funktioniert bei mir die Einbindung nicht. Für welche Mediawiki-Version wurde die Extension erstellt?

    Ich erhalte den Fehler:

    Interner Fehler
    Detected bug in an extension! Hook setPermissionsFromTags failed to return a value; should return true to continue hook processing or false to abort.

    Wenn ich die Extension auskommentiere ist der Fehler weg.

    mfg

  4. Okay,

    der XHTML code-Tag funtioniert nicht!

    Hier nochmal die Fehlermeldung:

    Interner Fehler

    Detected bug in an extension! Hook setPermissionsFromTags failed to return a value; should return true to continue hook processing or false to abort.

  5. @Sunny: Sorry, die Extension pflege ich nicht mehr aktiv weiter. Aber versuch doch mal den Fehler selbst zu beheben und gib als Returnwert in setPermissionsFromTags() einfach true zurück…

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax