2012-01-25 31 views
9

Actualmente estoy trabajando en un sitio que tiene un inicio de sesión (nombre de usuario y contraseña) - La protección de contraseña se realiza por el sistema operativo dentro del servidor web a nivel de carpeta llamado un Reino dentro el sistema operativo. Por ahora esto tendrá que hacer, hasta que descubramos un sistema apropiado de inicio de sesión en PHP.PHP Session Destruir al cerrar sesión Botón

El código siguiente, se basa en una previous question on the stack overflow.

estoy usando 3 archivos (Ver fragmentos de código en la parte inferior).

El proceso es: - Haga clic en el botón Iniciar sesión en index.php - Introduzca el nombre de usuario y la contraseña para acceder al archivo de índice de autenticación. - Haga clic en el botón de cerrar sesión, que hace referencia al archivo logout.php; DEBERÍA borrar el caché y devolver al usuario al índice de nivel superior.

No 'destruye la sesión' en el sentido de que no se le pide que vuelva a ingresar la contraseña cuando se le solicite, que es esencialmente lo que quiero que suceda.

Mi conocimiento mínimo de php me deja un poco perplejo aquí.

index.php (archivo de nivel superior con registro en el botón)

<?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> 

autenticar/index.php (Esta carpeta está protegida por contraseña - contiene el archivo de índice con el botón de cierre de sesión en vínculos en el fichero de 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> 

autenticar/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

Si la carpeta está protegida por contraseña, entonces PHP no está haciendo la autenticación. Apache (o el servidor web) es. – xbonez

+0

Eso tiene sentido, muchas gracias @xbonez – fitzilla

Respuesta

22

La carpeta está protegida por contraseña tiene nada que ver con PHP!

El método utilizado se denomina "Autenticación básica". No hay formas de "cerrar sesión" entre navegadores, excepto para pedirle al usuario que cierre y luego abra su navegador ...

Así es como podría hacerlo en PHP (quite por completo su autenticación básica de Apache) en .htaccess o donde sea primero):

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>'; 

Obviamente, esto es una implementación básica muy. Es de esperar que los nombres de usuario y las contraseñas estén en una base de datos, no como una comparación codificada. Solo intento darte una idea de cómo hacer la sesión.

Espero que esto lo ayude a entender lo que está pasando.

+0

¡Impresionante! Mucho mejor que el método de autenticación HTTP, cuyo código de inicio de sesión es mucho más complicado. Si agrega las etiquetas de cierre de PHP en los tres bloques de código, subiré la respuesta. Oops, ¡ya lo hice! :-) –

+1

@FrankConijn Consulte http://php.net/manual/en/language.basic-syntax.phptags.php: "Si un archivo es puro código PHP, es preferible omitir la etiqueta de cierre de PHP en el Fin del archivo. Esto evita el espacio en blanco accidental o la adición de nuevas líneas después de la etiqueta de cierre de PHP, que puede causar efectos no deseados porque PHP iniciará el almacenamiento en búfer de salida cuando el programador no tiene intención de enviar ningún resultado en ese punto del script. " – stackunderflow

+0

Creo que el cierre de sesión debe implementarse mediante el método de publicación, no obtener. – chespinoza

3

Primero, proporcione el enlace de la página logout.php en ese botón de cierre de sesión.En esa página que el código que se da a continuación:

Aquí está el código:

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

Cuando se haya iniciado la sesión, la sesión para el último usuario/corriente se ha iniciado, por lo que no necesita declarar el nombre de usuario Se eliminará automáticamente mediante el método session_destroy.

0

// Cerrar sesión

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

?>

+0

Gracias por este fragmento de código, que podría proporcionar alguna ayuda limitada a corto plazo. Una explicación adecuada [mejoraría en gran medida] (// meta.stackexchange.com/q/114762) su valor a largo plazo mostrando * why * esta es una buena solución al problema, y ​​lo haría más útil para los lectores futuros con otras preguntas similares. Por favor [edite] su respuesta para agregar alguna explicación, incluidas las suposiciones que ha hecho. –

Cuestiones relacionadas