Logear un solo usuario sin BD.

Resumen.

En este artículo vamos a tratar uno de los puntos tan sensible como imprescindible en cualquier sitio Web, la identificación de usuarios, y lo haremos desde lo más básico, el reconocimiento de un solo usuario, por supuesto, sin base de datos. Vamos a desgranar paso a paso todo el proceso que es común a todos los sistemas de identificación en PHP, (y no solo en PHP), aunque pueda tomar diferentes formas.

Artículo.

El proceso de identificación de usuarios es algo presente en cualquier sitio Web que requiera guardar algún tipo de información a salvo de miradas ajenas. Esta funcionalidad normalmente se realiza mediante base de datos con lo que no se limita a un solo usuario, pero dado que para algunos casos puede ser útil y sobre todo, rápida de montar, lo que aquí mas nos interesa es diseccionar como realizar un proceso de identificación o logeo.

Esta aplicación va a constar inicialmente de cuatro páginas, que son las siguientes:

form_login.php.- Esta página contiene el formulario donde el usuario introduce sus datos de acceso, usuario y clave. Dado que para el envío de datos no hace falta PHP nos podemos limitar a una simple página en HTML.

reconocimiento.php.- Será la página que reconocerá si los datos introducidos son válidos, y si lo son, nos enviará a la página protegida a la que deseamos acceder. Dado que no usaremos base de datos, aquí también estarán guardados los datos del usuario válido.

pagina_privada.php.- Será la página que contendrá los datos privados a los que solo se podrá acceder si se ha introducido unos datos de acceso válidos.

cerrar.php.- Esta página será aquella que se encargue de que los usuarios dejen de estar identificados, es decir, una vez que has pulsado en enlace a esta página, tendrías que volver a identificarte para acceder a la página privada.

El formulario que envía los datos es este:

form_login.php
<form method="POST" action="reconocimiento.php" name="login">
<fieldset>
<legend>Login</legend>
<label for="usumail">Usuario / E-mail</label>
<input class="cmp30" type="text" id="usumail" name="usumail" />

<label for="clave">Clave</label>
<input class="cmp30" type="password" id="clave" name="clave" />

<input class="btn" type="submit" value="Entrar" />
</fieldset>
</form>


Como podemos ver es HTML puro, no tiene mas complicaciones ni nada que explicar, salvo que el método de envío sea por POST, si o si. Agregar que a mí, y esto es una costumbre personal, me gusta que los usuarios se puedan identificar de manera indistinta con su nombre de usuario o su dirección de e-mail. En este caso, esto no tiene mayor relevancia, pero la tendrá cuando tengamos nuestro sistema de identificación soportado en base de datos.

La siguiente página es aquella que reconoce si los usuarios introducen datos válidos para la identificación, y dado que en este caso no operamos con base de datos, también en ella tendremos los datos del único usuario al que se le va a permitir el acceso. La página es esta:

reconocimiento.php
<?php session_start();

// Datos de acceso validos
$usumail_ok = 'Juan';
$clave_ok = '1234';

$usumail = $_POST['usumail'];
$clave = $_POST['clave'];

if($usumail == $usumail_ok AND $clave == $clave_ok){
// Usuario identificado
$_SESSION['datos_OK'] = 1; // Creamos una sesion
header("Location: pagina_privada.php");
}else{
// Usuario no identificado
header("Location: form_login.php");
}
?>


Para que nuestro sistema de identificación sea optimo, lo fundamental es que la variable que indica que el usuario se ha identificado correctamente se propague como variable de sesión. Por tanto, tras la apertura de PHP, lo primero, inicializar las sesiones con session_start();.

Una vez hecho esto, lo primero que vamos a hacer es guardar en sendas variables los datos de usuario y clave válidos. Así tenemos dos variables: $usumail_ok y $clave_ok, a las que le asignamos los datos válidos que el usuario tendrá que introducir en el formulario para identificarse.

Seguidamente recibimos mediante POST los datos provenientes del formulario, y una vez recibidos estos, los comparamos con los datos contenidos en las variables de usuario válido mediante el condicional else.

if($usumail == $usumail_ok AND $clave == $clave_ok){
// Usuario identificado
$_SESSION['datos_OK'] = 1; // Creamos una sesion
header("Location: pagina_privada.php");
}else{
// Usuario no identificado
header("Location: form_login.php",TRUE,301);
}


Este condicional básicamente nos dice, si el usuario recibido es igual al usuario válido y la clave recibida es igual a la clave valida, entonces creamos una sesión llamada datos_OK que tomará el valor 1. y enviamos al usuario a la página privada. En caso contrario, enviamos al usuario de nuevo al formulario de identificación. Así de sencillo, esta es la lógica de todo sistema de identificación, aunque como veremos en capítulos posteriores, esto mismo, lo podemos hacer de diferentes formas.

La página que hemos protegido, pagina_privada.php, y almacerá información solo accesible para ese usuario solo tiene que reconocer la existencia de la variable de sesión datos_OK.

pagina_privada.php
<?php session_start();
$datos_OK = $_SESSION['datos_OK']; // Recuperamos sesion
if($datos_OK <> 1){
header("Location: form_login.php",TRUE,301);
exit();
}else{
echo '<p>Te has identificado correctamente</p>
<p>Aqui van los contenidos que solo se muestran al usuario identificado correctamente.</p>
<p>Te has identificado correctamente</p>

<p align="right"><a href="cerrar.php" title="Dejar de estar identificado">Cerrar sesion</a></p>';
}
?>


Para lo cual, lo primero que hacemos e inicializar las sesiones y tras recuperar la variable de sesión, a la que le asignamos como valor 1, creamos un condicional que nos dice: si la variable $datos_OK (que contiene el valor de la sesión) es distinto de 1, el usuario no esta identificado, por lo que lo enviamos al formulario de identificación, en caso contrario, podrá ver los datos protegidos, privados.

Por ultimo, la página que precisaremos será cerrar.php, que como dijimos, su función es que el usuario deje de estar identificado.

cerrar.php
<?php session_start();
unset($_SESSION['datos_OK']); // Eliminamos la sesion
header("Location: form_login.php");
?>


Lograr esto es muy sencillo, si antes creamos una variable de sesión para reconocer a un usuario una vez introducidos los datos válidos, ahora lo que tenemos que hacer es eliminar esa variable de sesión, así de sencillo. Y como solo queremos eliminar esta variable de sesión usaremos la función nativa unset(), que elimina cualquier variable, incluida las de sesión. En este sentido comentar lo siguiente, si para recuperar la sesión hacemos esto:

$datos_OK = $_SESSION['datos_OK'];

y seguidamente para eliminar esto:

unset($datos_OK);

la sesión no será eliminada, ya que cuando guardamos la sesión en una variable al aplicar la función unset() simplemente eliminamos la variable, pero lo que debemos es eliminar la sesión, por tanto precisamos de eliminar la sesión de manera especifica y no una variable que contiene el valor de la sesión, y esto lo que haremos de esta forma:

unset($_SESSION['datos_OK'])


Y hecha esta aclaración, podemos decir que ya hemos creado nuestro primer plugin de identificación o logear de usuarios. ¿Esta completa? Pues no, seria conveniente agregar un método de validación como el que vimos en este artículo (y alguna cosita más), pero las vulnerabilidades principalmente afectan a las conexiones con bases de datos, y como aquí no la hay, pues…

Llegados a este punto, podemos decir que ya tenemos un sistema de identificación perfecto en lo que a la lógica de programación se refiere, pero puede resultar poco práctico que nuestras páginas protegidas tengan que mantener esa estructura condicional. Vamos a ver ahora que podemos hacer para hacer este trabajo de crear páginas protegidas sea mas sencillo.

Para ello vamos a crear un nuevo archivo, que lo llamaremos privacidad.php. El código seria el siguiente:

privacidad.php
<?php session_start();
if($_SESSION['datos_OK'] <> 1){
header("Location: form_login.php");
exit();
}
?>


Con este código lo que hacemos es recuperar la variable de sesión que nos indica que el usuario está identificado, para seguidamente, mediante un condicional if, y no else, como hicimos antes, comprobar que la sesión datos_ok toma un valor diferente a 1, y si así es, redirigimos al usuario al formulario de identificación y detenemos la ejecución de esta página mediante exit(). Si el valor de datos_ok es igual a 1 entonces no se realiza el direccionamiento ni se detiene la ejecución de la página.

Y esto ¿dónde nos lleva? Ahora nuestra página privada tomaría la siguiente forma:

pagina_privada2.php
<?php include('privacidad.php'); ?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<title>Pagina privada 2.</title>
</head>

<body>
<p>Y aqui tenemos nuestra nueva pagina privada con una sintaxis mas limpia y por tanto
menos propensa a cometer errores de programacion.</p>

<p align="right"><a href="cerrar.php" title="Dejar de estar identificado">Cerrar sesion</a></p>';
</body>

</html>


Como podemos ver, es una página en un simple código HTML, la única particularidad es que en la primera línea tenemos

<?php include('privacidad.php'); ?>


Es decir, cargamos la página privacidad.php, y con esto, ya tenemos reconocido a nuestro usuario, por lo demás, una página como otra cualquiera.
Tags: Aplicación PHP || login || identificación || plugin

Comentarios.

Sin comentarios, publica el tuyo.