Archiv für Juli 2010

Passwortschutz und URL-Rewriting

07.07.2010 Webwork Kommentieren

Möchte man ein Verzeichnis – zum Beispiel ein einfaches Administrationsmenü – mit einem Passwortschutz versehen ohne dabei eine überdimensionierte ACL zu bemühen, bieten sich die meist mitgelieferten Möglichkeiten des Apache-HTTP-Servers an. Allerdings ist es durch den Einsatz von CMS, Frameworks und mod_rewrite mittlerweile fast der Regelfall, dass vermeintliche Verzeichnishierarchien im URL nicht mit einer „physischen“ Verzeichnisstruktur im Dateisystem des HTTP-Servers korrespondieren und somit nicht möglich einfach eine entsprechende .htaccess-Datei in ein Verzeichnis zu legen. Wie man einen derartigen Passwortschutz dennoch relativ einfach realisiert, möchte ich nachfolgend kurz beschreiben.

Der gute alte Passwortschutz

Möchte man den URL http://example.com/admin/ mit einem Passwortschutz versehen und das Verzeichnis existiert tatsächlich im Dateisystem, reicht es eine .htaccess-Datei mit dem folgenden Inhalt in diesem Verzeichnis anzulegen (Vorausgesetzt eine entsprechende Passwort-Datei existiert):

AuthType Basic
AuthName "Anmeldung erforderlich"
AuthUserFile /Pfad/zu/Passwort-Datei
Require valid-user

Dies ist eine leichte Übung und die Vorgehensweise lässt sich auch in der Dokumentation des Apache-HTTP-Servers nachlesen.

Zugriffs-URI-basierter Passwortschutz

Gibt es das vermeintliche Verzeichnis allerdings gar nicht im Dateisystem, sondern existiert dieses nur in Rewriting-Regeln, dann fehlt schlichtweg der Ort um die entsprechende .htaccess-Datei abzulegen. Dies ist aber auch nicht zwingend notwendig, da man den Apachen mithilfe des Moduls SetEnvIf trotzdem dazu überreden kann, das „Geisterverzeichnis“ über die Abfrage von Zugangsdaten zu schützen. Dazu legt man eine .htaccess-Datei mit dem folgenden Inhalt im Wurzelverzeichnis an, auf das http://example.com zeigt, bzw. ergänzt die gegebenenfalls schon Vorhandene:

AuthType Basic
AuthName "Anmeldung erforderlich"
AuthUserFile /Pfad/zu/Passwort-Datei
Require valid-user

SetEnvIf Request_URI "/admin" req_auth=1

Order Allow,Deny
Allow from all
Deny from env=req_auth
Satisfy any

Über die SetEnvIf-Direktive weist man den HTTP-Server zunächst dazu an, die Umgebungsvariable req_auth (diese kann auch anders genannt werden) zu setzen, sofern der Zugriffs-URI „/admin“ lautet. Im weiteren erlaubt man nun jedem den Zugriff (durch das Ablegen der .htaccess im Wurzelverzeichnis hätten wir sonst den Zugriff auf die komplette Website unterbunden) und verbietet den Zugriff, sofern die Umgebungsvariable req_auth gesetzt ist. Mit der abschließenden Satisfy-Direktive wird dafür gesorgt, dass es reicht, dass eine der beiden Bedingungen (req_auth nicht gesetzt oder angemeldeter Benutzer) erfüllt ist. Fertig. Freuen.

Zum Seitenanfang