Software-Entwicklungen
(AddOns für das Web-Content-Management-System Redaxo)

Kontrolle des Zugriffs auf Artikel und Mediendateien für Redaxo 5
Version 2.3.2
Autor: Wolfgang Busch

Dieses AddOn ermöglicht eine Zugriffskontrolle für ausgewählte Bereiche von Artikeln und/oder Mediendateien. Damit ist gemeint, dass ein Besucher im Front-End eine Authentifizierung benötigt, um bestimmte Seiten oder Mediendateien sehen zu dürfen. Auf diese Weise wird auch eine Besuchergruppe eingerichtet, die von der allgemeinen Öffentlichkeit abgegrenzt ist.
Der Zugriff wird über die Authentifizierung von Redaxo-Benutzern kontrolliert, denen über ihre Rollen die entsprechenden Bereiche zugeordnet sind.
Die erfolgte Autorisierung wird Session-basiert gespeichert.
Es ist nur eine einfache Rewrite-Regel erforderlich.
Das AddOn ist komplett zweisprachig eingerichtet (deutsch, englisch).
 
Geschützte Bereiche:
Die Zugriffskontrolle kann für jede beliebige Kategorie eingerichtet werden ("geschützter Bereich"). Der Schutz erstreckt sich dann auf alle Artikel, die in dieser Kategorie und in ihren Unterkategorien liegen. Ggf. muss der inhaltlich aufgebaute Kategorienbaum zugunsten des Datenschutzes umstrukturiert werden, indem schutzwürdige Artikel in einen geschützten Bereich verschoben werden.
Analog kann eine vorhandene oder eine neue Top-Medienkategorie als geschützter Bereich für Mediendateien eingerichtet werden.
Darüber hinaus kann bei Bedarf auch eine Kategorie als "verbotener Bereich" eingerichtet werden. Auf diesen hat nur der Site-Administrator Lesezugriff als Besucher, wenn er im Backend eingeloggt ist.

Login-Seite:
Die Authentifizierung erfolgt über eine Login-Seite, die an geeigneter Stelle einzurichten ist. Ein entsprechendes Formular ist verfügbar.

Bewacher-Benutzer:
Auf der Login-Seite muss der Login-Name und das zugehörige Passwort eines Redaxo-Benutzers verifiziert werden. Die Zuordnung der geschützten Kategorie bzw. Medienkategorie zu diesem Benutzer ("Bewacher-Benutzer") wird im Rahmen der Redaxo-Benutzerverwaltung über entsprechende Rollen realisiert.
Einem Bewacher-Benutzer können mehrere geschützte Bereiche zugeordnet werden, sowohl Kategorien als auch Medienkategorien.

Überprüfung der Zugriffsberechtigung:
Ob ein angeforderter Artikel öffentlich, geschützt oder verboten ist, kann mithilfe einer AddOn-Funktion festgestellt werden, sinnvollerweise im Seiten-Template. Dort kann ggf. ein Hinweis oder ein Link auf die Login-Seite anstelle des Artikelinhalts angezeigt werden. Ein exemplarischer PHP-Code-Schnipsel ist verfügbar.
Die Überprüfung, ob eine Mediendatei öffentlich oder geschützt ist, erfolgt in der Boot-Datei. Bei fehlender Zugriffsberechtigung wird anstelle der angeforderten Mediendatei ein Standard-Fehlerbild angezeigt.
 
Einrichtung von Bewacher-Benutzern:
Ein Bewacher-Benutzer wird wie ein Redakteur in der Benutzerverwaltung angelegt:
Er wird als inaktiv definiert, sein Passwort kann daher nur mit Admin-Rechten geändert werden.
Das Feld "Beschreibung" bekommt den Wert "Protector" (bzw. "Guardian" für den verbotenen Bereich).
Ihm wird eine Rolle zugewiesen. In dieser sind Kategorien und Top-Medienkategorien auszuwählen, die normalerweise den Verantwortungsbereich (Schreibzugriff) des Benutzers als Redakteur definieren. Hier werden sie als geschützte Bereiche interpretiert.
Ein Bewacher-Benutzer kann mehrere derartige Rollen erhalten. Auf diese Weise ist es möglich, dass sich geschützte Bereiche überschneiden und der Zugriff auf Kategorien von mehr als einem Bewacher kontrolliert wird.
Nach Einrichtung der Bewacher-Benutzer wird der Schutzmechanismus durch Re-Installation des AddOns aktiviert bzw. aktualisiert. Dabei werden die zugehörigen Daten im AddOn-Cache abgelegt (json-codiert).

Anmeldeverfahren für Bewacher-Benutzer:
Es ist ein Artikel anzulegen, der nur den Aufruf der AddOn-Funktion login_page() enthält ("Login-Seite").
 <?php $uid=access_control::login_page(); ?>
Die Seite zeigt ein Eingabeformular für einen Bewacher-Benutzer und dessen Passwort an.
Ein URL-Parameter uid=$uidlist der Seite definiert eine Auswahl von Bewacher-Benutzern, die sich auf der Seite authentifizieren können. $uidlist ist eine Komma-separierte Liste der entsprechenden Bewacher-Ids, die in der Funktion eingelesen wird. Durch eine leere Liste oder einen fehlenden URL-Parameter werden alle definierten Bewacher-Benutzer ausgewählt.
Die Funktion überprüft den Login-Namen des Bewacher-Benutzers sowie dessen Passwort (in verschlüsselter Form) und speichert im Erfolgsfalle dessen für die Zugriffskontrolle notwendigen Daten in einem Session-Array ab.
Falls die Authentifizierung erfolgreich war, gibt die Funktion die Id des eingegebenen Bewachers zurück, andernfalls die eingelesene Id-Liste. Der Rückgabewert kann ggf. weiter ausgewertet werden.
Ist ein Bewacher-Benutzer eingeloggt, zeigt ein erneuter Aufruf der Login-Seite zunächst nur einen Abmelden-Button. Erst nachdem die Abmeldung erfolgt ist, wird ein neues Authentifizierungsformular - passend zum URL-Parameter - angezeigt.

Kontrolle des Zugriffs auf die aktuelle Seite:
Der Rückgabewert der AddOn-Funktion protected_or_prohibited() ermöglicht die Entscheidung, ob die aktuelle Seite angezeigt werden darf oder nicht:
=0: die Seite ist öffentlich, oder der Besucher ist autorisiert
=1: verbotener Bereich, der Besucher ist nicht als Site-Administrator im Backend eingeloggt
>1: Id des Bewacher-Benutzers der Seite (oder eine Komma-separierte Liste mehrerer Ids >1),
      der Besucher hat sich nicht authentifiziert
Es folgt ein schematisches PHP-Code-Schnipsel für ein Seiten-Template, um ggf. einen entsprechenden Hinweis oder einen Link auf eine Login-Seite anstelle des Artikelinhalts anzuzeigen:
 $uid=access_control::protected_or_prohibited();
 if($uid>0):
    if($uid==1):
     echo '<p>prohibited area, reserved for the site administrator</p>';
     else:
     $path='/login.html';   // path to the sign-in page,  t o   b e   r e p l a c e d   individually
     echo '<p>article in protected area, access requires authentication</p>';
     echo '<p><a href="'.$path.'?uid='.$uid.'">Sign in</a></p>';
     endif;
   else:
   echo $this->getArticle(); // article content
   endif;
Ein Redaxo-Redakteur hat als Besucher auch dann Lesezugriff auf seine Seiten, wenn diese in geschützten Bereichen liegen, sobald er sich im Backend eingeloggt hat.

Adressumleitung der Mediendateien:
 RewriteRule  ^media/(.*)$  index.php?auth_file=$1
Auf diese Weise ist in allen Medienreferenzen die betreffende Datei mittels rex_request-Funktion erfassbar, und die Zugriffsberechtigung kann schon in der Boot-Datei kontrolliert werden.
 

Anzeige eines Bespiels

AddOn-Download