2010-08-16 22 views
5

Chciałbym ustawić, gdzie jeśli ktoś wyśle ​​żądanie "wyloguj", automatycznie przeniesie je na stronę z napisem "pomyślne wylogowanie". Jeśli klient spróbuje nacisnąć przycisk Wstecz lub przejść do obszaru zastrzeżonego, poprosi o ponowne uwierzytelnienie HTTP.PHP: HTTP Basic - Wylogowanie

Co mam tak daleko jest taka:

example.com/restricted/index.php:

<?php 
    session_start(); 

    if(isset($_GET['logout'])) 
    { 
     unset($_SESSION["login"]); 
     header("location: ../logout.php"); 
     exit; 
    } 

    if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) || !isset($_SESSION["login"])) 
    { 

     header("HTTP/1.0 401 Unauthorized"); 
     header("WWW-authenticate: Basic realm=\"Tets\""); 
     header("Content-type: text/html"); 
     $_SESSION["login"] = true; 
     // Print HTML that a password is required 
     exit; 
    } 
?> 
// The rest of the page is then displayed like normal 

Użytkownik udane wizyty example.com/logout.php jeśli przykładem. Dostęp do komendy com/restricted/index.php? logout. Kiedy użytkownik próbuje wrócić, jakkolwiek przypadkowe rzeczy się zdarzają, czasami będzie prosić o uwierzytelnienie HTTP dwa razy (???), czasami będzie prosić o uwierzytelnienie w pętli (?), A czasami pozwoli mi wrócić z powrotem, jak gdyby Nigdy się nie wylogowałem.

Jestem nowy, jak działają sesje, ale moje zrozumienie jest następujące: Jeśli/kiedy osoba jest zatwierdzona, przechowuje zmienną w swojej sesji o nazwie login z wartością true ... jeśli każda otrzyma żądanie GET z wyloguj się, następnie usunie tę zmienną sesji i wróci do logout.php ... Dlaczego to jest, gdy kliknę z powrotem do indeksu, pozwoli mi wrócić bez pytania o uwierzytelnienie, kiedy sesja [login] prawdopodobnie nie jest ustawiona .

Wszelkie ulepszenia tego kodu PHP są mile widziane. Wiem, że nie powinienem używać HTTP Basic i powinien zawierać SQL, ale meh. To jest tymczasowe rozwiązanie.

Edytuj: Przyjmę rozwiązanie z MySQL, jeśli dołączony jest przykład z instrukcjami. Nie mam MySQL lub PHP, bazy wiedzy (jeszcze)

+1

Bez sesji najlepszym wyjściem jest zmiana podstawowego ciągu dziedzinowego. – stillstanding

+0

Czy to nie tyle wysiłki, tylko tymczasowe rozwiązanie? –

+0

@stosowanie się do głównego problemu to KIEDY go wysłać. Jak odróżnić połączenie od zalogowanego użytkownika od wywołania z wylogowanego :) –

Odpowiedz

1

grubsza zacząć cię:

<?php 
    session_start(); 

    if(isset($_GET['logout'])) 
    { 
    session_destroy(); 
    header('Location: ../logout.php'); 
    exit; 
    } 

    if(!isset($_SESSION['login'])) 
    { 
    if(!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])) 
    { 
     header("HTTP/1.0 401 Unauthorized"); 
     header("WWW-authenticate: Basic realm=\"Tets\""); 
     header("Content-type: text/html"); 
     // Print HTML that a password is required 
     exit; 
    } 
    else 
    { 
     // Validate the $_SERVER['PHP_AUTH_USER'] & $_SERVER['PHP_AUTH_PW'] 
     if($_SERVER['PHP_AUTH_USER']!='TheUsername' 
      || $_SERVER['PHP_AUTH_PW']!='ThePassword') 
     { 
     // Invalid: 401 Error & Exit 
     header("HTTP/1.0 401 Unauthorized"); 
     header("WWW-authenticate: Basic realm=\"Tets\""); 
     header("Content-type: text/html"); 
     // Print HTML that a username or password is not valid 
     exit; 
     } 
     else 
     { 
     // Valid 
     $_SESSION['login']=true; 
     } 
    } 
    } 
?> 
// The rest of the page is then displayed like normal 
+0

W jaki sposób mogę sprawdzić PHP_AUTH_USER i PHP_AUTH_PW bez analizowania i .htpass i innych? – ParoX

+0

Jeśli jest to rozwiązanie tymczasowe, a potrzebujesz tylko jednego zestawu nazwy użytkownika/hasła, po prostu zrób coś w stylu: 'if ($ _SERVER ['PHP_AUTH_USER']! = 'TheUsername' || $ _SERVER ['PHP_AUTH_PW']!= 'ThePassword') {/ * 401 Error & Exit * /} else {$ _SESSION ['login'] = true} ' Osobiście nie używałem wcześniej PHP_AUTH_USER/PHP_AUTH_PW, mam zwykle formularz, który mnie przekazuje ich nazwa użytkownika i hasło przez $ _GET lub $ _POST - znacznie prostsze. –

+0

@ Brian zapisać login i przekazać w db? –

1

Znalazłem sposób wokół niego.

mam 2 pliki: index.php i logout.php

Oto mój 'index.php' Kod:

# CHECK LOGIN. 
if (!isset($_SESSION["loged"])) { 
    $_SESSION["loged"] = false; 
} else { 
    if (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) { 
     if (($_SERVER['PHP_AUTH_USER'] == L_USER) && (md5($_SERVER['PHP_AUTH_PW']) == L_PASS)) { 
      $_SESSION["loged"] = true; 
     } 
    } 
} 
if ($_SESSION["loged"] === false) { 
    header('WWW-Authenticate: Basic realm="Need authorization"'); 
    header('HTTP/1.0 401 Unauthorized'); 
    die('<br /><br /> 
    <div style="text-align:center;"> 
     <h1 style="color:gray; margin-top:-30px;">Need authorization</h1> 
    </div>'); 
} 

I tu jest moje 'wylogowania .php 'code:

session_start(); 
$_SESSION["loged"] = false; // We can't use unset($_SESSION) when using HTTP_AUTH. 
session_destroy(); 
0

Możesz użyć metatagu http-equiv="refresh" z bardzo krótkim czasem odpowiedzi (np. content="1"). To odświeżenie wyczyści dowolne $_POST.

if (!isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER']!='myusername' || $_SERVER['PHP_AUTH_PW']!='mypassword' || isset($_POST['logout'])) { 
    header('WWW-Authenticate: Basic realm="My protected area"'); 
    header('HTTP/1.0 401 Unauthorized'); 
    echo '<html><head><title>401 Unauthorized</title><meta http-equiv="refresh" content="1"></head><body><h1>401 Unauthorized</h1><p>You are not allowed to see this page. Reload the page to try again.</p></body></html>'; 
    exit(); 
}