Hallo Sven!
Solch ein Auslogg-Vorgang läßt sich prinzipiell auch mit HTTP-Authentifizierung bewerkstelligen - allerdings nur mit serverseitigem Scripting (PHP als Apache-Modul, nicht als CGI, ginge beispielsweise), nicht mit .htaccess. Näheres dazu (Ausloggen bei HTTP-Auth) steht im Archiv - Alexander Korthaus hat dazu mal eine Methode mittels PHP gefunden.
"Alexander Korthaus", aha... :)
Das Problem ist, dass die Browser unterschiedlich auf das Senden von 401-Headern reagieren. Beim IE läuft es so, dass man nach einem 401 sich wieder neu einloggen muss. Ältere Mozilla-Versionen versuchen _jeden_ Request erstmal ohne Auth-Header, und schicken dann beim Erhalt eines 401 automatisch denselben Requst nochmal - diesmal _mit_ Auth-Header (sofern man sich vorher mal eingeloggt hat). Neuere Mozilla-Versionen schicken inzwischen nach dem Login auch direkt den Auth-Header mit, aber man kann ihm dann durch Senden eines 401-headers keinen neues Login-promt entlocken. Ich habe das mal ne Zeit lang umgangen, indem ich für ein Logout einen anderen "authentication realm" gesendet habe, indem ich den Zeiptunkt mit reingeschreiben habe. Das hat auch grundsätzlich funktioniert, nur hatte ich zum einen Probleme zusammen mit Session-Cookies, und damit dass die HTTP-Authentifizierung z.B. nicht in zu öffnenden Word-Dokumenten... funktioniert hat(man musste sich dann in Word extra einloggen...).
Daher bin ich dann wohl oder übel wieder bei HTML-Formularen gelandet, der große Vorteil ist einfach die 100%ig serverseitige Kontrolle.
http://forum.de.selfhtml.org/archiv/2003/9/56697/
btw., die Dateien sind nicht mehr da, aber das ist auch gut so, denn so wie es da steht funktioniert es mit dem Mozilla nicht 100%ig zuverlässig.
Ich habe aber eine Idee wie ich es ändern würde das es funktionieren müsste... Das große Problem bei der Geschichte ist zu unterscheiden - wann sendet der Browser den Auth-Header automatisch - und wann kommen die Daten tatsächlich vom User.
Grüße
Andreas
der alte Source(nicht verwenden!):
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
<?php
// Sessions sind Voraussetzung
session_start();
// user ausloggen (säter vielleicht eher mit session_destroy()...)
if($_REQUEST['action'] == 'logout') {
$_SESSION['auth']['status'] = 'off';
display_logout();
}
// prüfen ob user eingeloggt ist
if ($_SESSION['auth']['status'] != 'on') {
if (!isset($_SERVER['PHP_AUTH_USER'])) {
// user sendet keine Auth-Daten -> komplett neuer Login, noch kein Login im aktuellen Browserfenster gewesen
$_SESSION['auth']['newlogin'] = 1;
authenticate();
}
else {
// user sendet Auth-Daten: entweder durch Aufforderung oben, oder wegen "relogin"
if ($_SESSION['auth']['newlogin'] == 1) {
// neue Daten eingegeben
check_auth();
$_SESSION['auth']['newlogin'] = 0;
$_SESSION['auth']['status'] = 'on';
display_login();
}
else {
// 'relogin': damit auch Mozilla Auth-Daten nicht automatisch aus dem Cache schickt -> sende "unique realm"
$_SESSION['auth']['newlogin'] = 1;
re_authenticate();
}
}
}
else {
display_login();
}
// Authentifizierungs Header senden
function authenticate() {
header ('HTTP/1.0 401 Unauthorized');
header ("WWW-Authenticate: Basic realm="Test Authentication System"");
die ("You must enter a valid login ID and password to access this resource\n");
}
// Authentifizierungs Header mit "unique realm" senden (damit Mozilla bei Relogin nicht Auth-Daten aus dem Cache verwendet)
function re_authenticate() {
$unique = date ('d.m.Y, h.i.s');
header ('HTTP/1.0 401 Unauthorized');
header ("WWW-Authenticate: Basic realm="Test Re-Authentication System ($unique)"");
die ("You must enter a valid login ID and password to access this resource\n");
}
// HTML Quellcode für "logged in" Seite
function display_login() {
die ('<html><body><h3>User logged in</h3><a href="auth.php?action=logout">logout</a><br></body></html>');
}
// HTML Quellcode für "logged out" Seite
function display_logout() {
die ('<html><body><h3>User logged out</h3><a href="auth.php">login again</a><br></body></html>');
}
// Authentifzierung mit DB... durchführen
function check_auth() {
// check Auth...
}
?>