2012-01-25 13 views
9

Attualmente sto lavorando su un sito che ha un accesso (nome utente e password) - La protezione della password viene eseguita dal sistema operativo all'interno del server Web a livello di cartella chiamato un dominio all'interno il sistema operativo. Per ora ciò dovrà essere fatto, fino a quando non scopriremo un sistema di accesso PHP corretto.PHP Session Destroy on Logout Button

Il codice di seguito, si basa su un previous question on the stack overflow.

che sto usando 3 file (Vedi frammenti di codice in basso).

Il processo è: - Fare clic sul pulsante Accedi su index.php - Immettere nome utente e password per accedere al file indice di autenticazione. - Fare clic sul pulsante di disconnessione, che fa riferimento al file logout.php: DOVREBBE cancellare la cache e restituire l'utente all'indice di livello superiore.

Non "distrugge la sessione" nel senso che non ti viene chiesto di reinserire la password quando viene richiesto, che è essenzialmente ciò che voglio che accada.

La mia conoscenza minima del php mi lascia un po 'perplesso qui.

index.php (file di livello superiore con accesso a pulsante)

<?php session_start(); ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<title>Test</title> 
</head> 
<body> 
<a href="authenticate/index.php">Log In Btn</a> 
</body> 
</html> 

autenticazione/index.php (Questa cartella è protetto da password - contiene il file indice con la trave dal quale pulsante link al file logout.php)

<?php session_start(); ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<title>Log out</title> 
</head> 
<body> 
<a href="logout.php">Log Out Btn</a> 
</body> 
</html> 

autenticazione/logout.php

<?php 
session_start(); //to ensure you are using same session 
session_destroy(); //destroy the session 
header("location:/index.php"); //to redirect back to "index.php" after logging out 
exit(); 
?> 
+3

Se la cartella è protetta da password, quindi PHP non sta facendo l'autenticazione. Apache (o il server web) è. – xbonez

+0

Questo ha senso, grazie mille @xbonez – fitzilla

risposta

22

La cartella di essere protetto da password non ha nulla a che fare con PHP!

Il metodo utilizzato è denominato "Autenticazione di base". Non ci sono modi cross-browser per "disconnettersi" da esso, tranne chiedere all'utente di chiudere e quindi aprire il proprio browser ...

Ecco come si potrebbe farlo in PHP invece (rimuovere completamente l'autenticazione di base Apache in .htaccess o dovunque sia prima):

login.php:

<?php 
session_start(); 
//change 'valid_username' and 'valid_password' to your desired "correct" username and password 
if (! empty($_POST) && $_POST['user'] === 'valid_username' && $_POST['pass'] === 'valid_password') 
{ 
    $_SESSION['logged_in'] = true; 
    header('Location: /index.php'); 
} 
else 
{ 
    ?> 

    <form method="POST"> 
    Username: <input name="user" type="text"><br> 
    Password: <input name="pass" type="text"><br><br> 
    <input type="submit" value="submit"> 
    </form> 

    <?php 
} 

index.php

<?php 
session_start(); 
if (! empty($_SESSION['logged_in'])) 
{ 
    ?> 

    <p>here is my super-secret content</p> 
    <a href='logout.php'>Click here to log out</a> 

    <?php 
} 
else 
{ 
    echo 'You are not logged in. <a href="login.php">Click here</a> to log in.'; 
} 

logout.php:

<?php 
session_start(); 
session_destroy(); 
echo 'You have been logged out. <a href="/">Go back</a>'; 

Ovviamente questo è un molto implementazione di base. Ci si aspetterebbe che i nomi utente e le password si trovino in un database, non come un confronto hardcoded. Sto solo cercando di darti un'idea di come fare la sessione.

Spero che questo ti aiuti a capire cosa sta succedendo.

+0

Fantastico! Molto meglio del metodo di autenticazione HTTP, di cui il codice di disconnessione è molto più complicato. Se vuoi aggiungere i tag di chiusura PHP in tutti e tre i codici, salverò la tua risposta. Oops, l'ho già fatto! :-) –

+1

@FrankConijn Si prega di consultare http://php.net/manual/en/language.basic-syntax.phptags.php: "Se un file è puro codice PHP, è preferibile omettere il tag di chiusura PHP al fine del file. Questo impedisce che vengano aggiunti spazi bianchi accidentali o nuove righe dopo il tag di chiusura di PHP, il che può causare effetti indesiderati poiché PHP avvierà il buffering dell'output quando non vi è intenzione dal programmatore di inviare alcun output in quel punto dello script. " – stackunderflow

+0

Penso che il logout dovrebbe essere implementato usando il metodo post, non ottenere. – chespinoza

3

Innanzitutto fornire il collegamento della pagina logout.php in tale pulsante di disconnessione.In quella pagina rendere il codice è riportato in appresso:

Ecco il codice:

<?php 
session_start(); 
session_destroy(); 
?> 

Quando la sessione è iniziata, è stata avviata la sessione per l'ultimo utente/corrente, quindi non hanno bisogno per dichiarare il nome utente. Sarà cancellato automaticamente dal metodo session_destroy.

0

// disconnettersi

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

?>

+0

Grazie per questo snippet di codice, che potrebbe fornire una guida limitata a breve termine. Una spiegazione appropriata [migliorerebbe notevolmente] (// meta.stackexchange.com/q/114762) il suo valore a lungo termine mostrando * perché * questa è una buona soluzione al problema e lo renderebbe più utile ai futuri lettori con altre domande simili. Per favore [modifica] la tua risposta per aggiungere qualche spiegazione, incluse le ipotesi che hai fatto. –