Ya tenemos el sistema de login montado de forma bastante segura pero todo se puede mejorar. En este último post de la serie explicaré como hacer que el usuario se quede logueado mediante sesiones del navegador y cookies que creamos en el post anterior.
Para ello creamos una función que detecte si el usuario tiene alguna sesión activada o alguna cookie correcta que le permita estar logueado sin necesidad de volver a rellenar el form. En mi caso la funció la he creado en un archivo llamado function.php
<?php
function is_login() {
// Comprobamos si existe sesión
if(isset($_SESSION['user'])) return true;
//Comprobamos si hay cookie, si está bien y le asignamos una sesión
if(isset($_COOKIE['nonce'])) {
$cookie = mysql_real_escape_string($_COOKIE['nonce']);
$query = mysql_query("SELECT * FROM users WHERE nonce='$cookie'") or die(mysql_error());
$data = mysql_fetch_array($query);
if(isset($data['username'])) {
$_SESSION['user'] = $data['username'];
return true;
}
}
return false;
}
?>
Como vemos en los comentarios de la función primero se comprueba si hay sesión de navegador, si la hay devuelve true y no ejecuta nada más. En caso de no encontrarla pasa a comprobar si hay cookie, en caso afirmativo comprueba que el nonce que contiene coincida con alguno de la BD y si es así inicia la sesión de navegador y devuelve true. En el caso que no existan ninguno de los dos devuelve false.
Esta función la usamos para saber si el usuario ya está dentro y por lo tanto no deberemos mostrarle el form o si por lo contrario no lo está y debemos exigir que se loguee. Para ello modificaremos el index.php que creamos anteriormente sustituyendo por el siguiente código:
<?
include_once("connect.php");
include("functions.php");
if(is_login()) {
// Aquí añadimos cualquier contenido que queramos que vean los usuarios registrados
echo "Hola <strong>".$_SESSION['user']."</strong>, ya estás dentro";
echo "<a href='logout.php'>Desconectar »</a>";
}else{
echo "<form action='login.php' class='clientform' method='post'>";
echo "<p><label for='username'>Nombre</label> <input type='text' name='username' id='username' tabindex='1' /></p>";
echo "<p><label for='password'>Clave</label> <input type='password' name='password' id='password' tabindex='2' /></p>";
echo "<p><input type='submit' value='Entrar' tabindex='3' /></p>";
echo "</form>";
}
?>
Este mismo if podemos adaptarlo a cualquier página que queramos mostrar únicamente a los usuarios registrados, simplemente añadiendo el include("functions.php"); y a continuación el if..else.
Por último, podemos observar que hay un enlace a logout.php:
<?
include('connect.php');
// Borramos cookie
$_COOKIE['nonce'] = '';
setcookie('nonce','',time()-3600,'/');
// Borramos sesión
$_SESSION['user'] = null;
unset($_SESSION);
session_destroy();
header("Location: /");
?>
Con este php conseguimos eliminar todos los elementos que mantienen logueado al usuario y redireccionamos a la portada de nuestra web, con el siguiente código header("Location: /");.
Para ser mi primera serie de posts sobre programación me ha ido bastante bien, espero haber sido lo suficientemente claro y que os haya sido de ayuda.
Gracias a Alex por el apunte sobre seguridad en los comentarios.
Posts relacionados:
Registro y login de usuarios ( i )
Registro y login de usuarios ( ii )
Registro y login de usuarios ( iii )