HTTP-Authentifizierung in JLog
Standardmäßig basiert das Anmelden in Jlogs Administrationscenter auf PHP-Sessions und Cookies. Cookies sind allerdings in manchen Umgebungen kritisch, d.h. nicht einsetzbar, weshalb man dort auf HTTP-Authentifizierung zurückgreifen kann. Dieser Beitrag erläutert, welche Anpassungen an Jlog dafür durchgeführt werden müssen.
Ersetzen des bisherigen Authentifizierungs-Mechanismus
Jedes Skript im Admincenter bindet die Datei auth.php ein, welche normalerweise sicherstellt, dass ein Benutzer eingeloggt ist; ist dies nicht der Fall, erfolgt eine Weiterleitung auf login.php. Da wir unsere eigene Authentifizierung einbauen, muss zuerst diese Datei geändert werden:
Die Benutzung der .htaccess
In diesem Fall ist es am Besten, die auth.php komplett zu leeren; das ist weniger umständlich, als in jedem Skript die entsprechende Zeile zu löschen. Anschließend legt man im Verzeichnis des Admincenters eine .htaccess an, beispielsweise
AuthType Basic AuthName "Jlog-Administrationscenter für Otto Normals Weblog" AuthUserFile /pfad/zur/htusers Require valid-user
Jetzt muss nur noch die htusers passend befüllt werden. Soll nur ein Name Zugriff haben, kann man in der .htaccess auch dessen Namen direkt bei Require hinschreiben.
Skript-basiertes HTTP-Auth
Natürlich können wir auch die auth.php so umschreiben, dass wir ebenfalls HTTP-Auth benutzen können. Der folgende Ausschnitt gibt eine Umriss wieder, wie man HTTP-Auth in PHP (und damit in Jlogs Admincenter) implementieren kann:
Achtung: Dies funktioniert nur, wenn PHP als Apache-Modul und nicht als CGI oder FCGI zur verfügung steht''
<?php
define('JLOG_ADMIN', TRUE); // gibt sonst Probleme mit den settings
if (! defined('_JL_BASE_'))
define('_JL_BASE_', '../');
// Damit holen wir uns das beim Setup eingerichtete Passwort
require_once _JL_BASE_ . 'personal/settings.inc.php';
function confirmLogin() {
if (! array_key_exists('PHP_AUTH_PW', $_SERVER)) {
header('HTTP/1.0 401 Unauthorized');
header('WWW-Authenticate: Basic realm="' .
'Jlog-Administrationscenter für' .
' Otto Normals Weblog"');
// Oh, wir leben noch, das muss ein Fehler sein,
// deshalb kurze Fehlerseite:
$reqUri = htmlspecialchars($_SERVER['REQUEST_URI']);
?><html><head><title>HTTP 403 - <?php
echo $reqUri;
?></title></head><body><h1>HTTP 403 Forbidden</h1>
<p>You are not allowed to access <kbd><?php
echo $reqUri;
?></kbd>.</p>
<?php
if (array_key_exists('SERVER_SIGNATURE', $_SERVER))
echo '<hr>', $_SERVER['SERVER_SIGNATURE'];
?></body></html><?php
exit;
}
else {
// Versionen >= 1.0.1 scheinen das Passwort vor dem
// Speichern mit MD5 zu behandeln, weshalb es dort
// heißen müsste:
# if (md5($_SERVER['PHP_AUTH_PW']) != JLOG_ADMIN_PASSWORD)
if ($_SERVER['PHP_AUTH_PW'] != JLOG_ADMIN_PASSWORD)
confirmLogin();
}
}
confirmLogin();
// Wir sind eingeloggt
Der Logout
Im Admincenter befindet sich nun immer noch ein Link mit der Aufschrift Ausloggen, der die Datei logout.php verlinkt. Eigentlich kann man diesen Link entfernen (zu finden in der Funktion output_admin_menu() in scripts/general.func.php), wer allerdings auf Nummer sicher gehen möchte, kann auch mit HTTP-Auth ein Ausloggen umsetzen (normalerweise reicht es aus, das Browserfenster zu schließen, aber selbst das ist nicht überall ohne Weiteres möglich):
<?php
header('HTTP/1.0 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Ende Gelaende"');
?>
