Saltar al contenido principal

Autentificación de usuarios

Una sesión establece una relación anónima con un usuario particular, de manera que podemos saber si es el mismo usuario entre dos peticiones distintas. Si preparamos un sistema de login, podremos saber quien utiliza nuestra aplicación.

Para ello, preparemos un sencillo sistema de autenticación:

  • Mostrar el formulario login/password.
  • Comprobar los datos enviados.
  • Añadir el login a la sesión.
  • Comprobar el login en la sesión para realizar tareas específicas del usuario.
  • Eliminar el login de la sesión cuando el usuario la cierra.

Vamos a ver en código cada paso del proceso. Comenzamos con el archivo index.php:

<form action='login.php' method='post'>
<fieldset>
<legend>Login</legend>
<div><span class='error'><?php echo $error; ?></span></div>
<div class='fila'>
<label for='usuario'>Usuario:</label><br />
<input type='text' name='inputUsuario' id='usuario' maxlength="50" /><br />
</div>
<div class='fila'>
<label for='password'>Contraseña:</label><br />
<input type='password' name='inputPassword' id='password' maxlength="50" /><br />
</div>
<div class='fila'>
<input type='submit' name='enviar' value='Enviar' />
</div>
</fieldset>
</form>

Al hacer submit nos lleva a login.php, el cual hace de controlador:

<?php
// Comprobamos si ya se ha enviado el formulario
if (isset($_POST['enviar'])) {
$usuario = $_POST['inputUsuario'];
$password = $_POST['inputPassword'];

// validamos que recibimos ambos parámetros
if (empty($usuario) || empty($password)) {
$error = "Debes introducir un usuario y contraseña";
include "index.php";
} else {
if ($usuario == "admin" && $password == "admin") {
// almacenamos el usuario en la sesión
session_start();
$_SESSION['usuario'] = $usuario;
// cargamos la página principal
include "main.php";
} else {
// Si las credenciales no son válidas, se vuelven a pedir
$error = "Usuario o contraseña no válidos!";
include "index.php";
}
}
}

Dependiendo del usuario que se haya logueado, vamos a ir a una vista o a otra. Por ejemplo, en main.php tendríamos:

<?php
// Recuperamos la información de la sesión
if(!isset($_SESSION)) {
session_start();
}

// Y comprobamos que el usuario se haya autentificado
if (!isset($_SESSION['usuario'])) {
die("Error - debe <a href='index.php'>identificarse</a>.<br />");
}
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Listado de productos</title>
</head>
<body>
<h1>Bienvenido <?= $_SESSION['usuario'] ?></h1>
<p>Pulse <a href="logout.php">aquí</a> para salir</p>
<p>Volver al <a href="main.php">inicio</a></p>
<h2>Listado de productos</h2>
<ul>
<li>Producto 1</li>
<li>Producto 2</li>
<li>Producto 3</li>
</ul>
</body>
</html>

Finalmente, necesitamos la opción de cerrar la sesión que colocamos en logout.php:

<?php
// Recuperamos la información de la sesión
session_start();

// Y la destruimos
session_destroy();
header("Location: index.php");
?>
Autenticación en producción

En la actualidad, la autenticación de usuario no se realiza gestionando la sesión direcamente, sino que se realiza mediante algún framekwork que abstrae todo el proceso o la integración de mecanismos de autenticación tipo OAuth.