En este artículo explicaremos cómo realizar la gestión de sesiones de un usuario previamente identificado en nuestra web con PHP. Una vez que disponemos de un sistema de login funcional y sabemos verificar de forma segura el usuario y la contraseña, el siguiente paso consiste en mantener la sesión activa entre páginas y controlar el acceso a las áreas privadas del sitio web.
La gestión de sesiones en PHP es el punto clave de un sistema de login de usuarios: gracias a las sesiones, el usuario no necesita identificarse en cada página y, al mismo tiempo, podemos restringir el contenido únicamente a quienes hayan iniciado sesión correctamente.
Este artículo forma parte de la serie Sistema de login con PHP, donde se explica paso a paso cómo construir un sistema completo de login de usuarios usando PHP y MySQL.
Sesiones en PHP
Para entender la gestión de sesiones en PHP, primero debemos saber que una sesión es un espacio temporal de almacenamiento que PHP crea automáticamente para cada usuario que interactúa con el sitio web. Este espacio único se genera al llamar a session_start(). En ese momento, PHP inicia una sesión y crea un identificador único llamado (session_id), que actúa como un token temporal para identificar de forma exclusiva esa sesión para el usuario concreto.
El session_id se almacena normalmente en una cookie en el navegador del usuario y PHP lo utiliza en cada petición para asociar los datos de sesión con ese usuario. De este modo, al navegar entre distintas páginas, PHP puede “recordar” quién es el usuario sin necesidad de volver a pedirle las credenciales.
La gestión de sesiones de PHP, permite a este identificador (session_id), asociar los datos que se almacenan en la variable global $_SESSION con el usuario que navega por el sitio. De esta forma, podemos crear perfiles de usuario ricos y complejos e incluso mantener una caché de datos personales para usuarios identificados.
Para que todo esto funcione correctamente, session_start(); debe colocarse al inicio de cada página que vaya a utilizar sesiones y siempre antes de generar cualquier salida HTML (aunque sea un espacio en blanco), ya que de lo contrario se producirá un error.
En el artículo anterior ya guardamos los datos de un usuario correctamente identificado en la variable global $_SESSION con:
// Si el usuario existe
if (mysqli_num_rows($resultado) > 0) {
$usuario = mysqli_fetch_assoc($resultado);
// Verificamos la contraseña cifrada
if (password_verify($password, $usuario['password'])) {
// Creamos las variables de sesión
$_SESSION['id'] = $usuario['id'];
$_SESSION['nombre'] = $usuario['nombre'];
$_SESSION['email'] = $usuario['email'];
$_SESSION['nivel'] = $usuario['nivel'];
// Redirigimos al área privada
header("Location: perfil.php");
exit;
}
}
Ahora vamos a ver cómo podemos trabajar con ellos y utilizar la gestión de sesiones de PHP con diferentes niveles de acceso.
Gestión de acceso en PHP
Al trabajar con la gestión de sesiones en PHP es importante comprobar que la sesión está activa antes de mostrar cualquier contenido privado de nuestra web:
<?php
session_start();
// Verificar si el usuario está logueado
if (!isset($_SESSION['id'])) {
// Usuario no logueado, redirigir a login
header("Location: login.php");
exit;
}
// Usuario logueado
echo "Bienvenido, " . $_SESSION['nombre'];
?>
Niveles de usuario
En nuestra gestión de sesiones en PHP, podemos definir diferentes niveles de acceso mediante $_SESSION['nivel']. De modo que podemos tener varios niveles de usuarios con diferentes tipos de acceso a contenidos, por ejemplo:
- Nivel 1: Usuario estándar
- Nivel 2: Moderador
- Nivel 3: Administrador
De este modo, que podemos proteger las páginas según el nivel del usuario, por ejemplo, las páginas de administrador:
<?php
session_start();
// Redirigir si no está logueado
if (!isset($_SESSION['id'])) {
header("Location: login.php");
exit;
}
// Comprobar nivel de acceso
if ($_SESSION['nivel'] < 2) {
// Usuario no autorizado para esta página
echo "No tienes permisos para acceder a esta sección.";
exit;
}
echo "Bienvenido administrador " . $_SESSION['nombre'] . ". Tienes acceso a esta sección exclusiva.";
?>
Esta forma de proteger las páginas permite que los niveles «superiores» también puedan acceder a los niveles «inferiores». Si quiere mantener cada nivel «exclusivo», entonces el condicional debe ser ($_SESSION['nivel'] == 2).
Contenido según nivel de usuario
También podemos tener única página PHP donde mostrar distintos contenidos según el nivel del usuario:
<?php
session_start();
if (!isset($_SESSION['id'])) {
header("Location: login.php");
exit;
}
switch ($_SESSION['nivel']) {
case 1: echo "Hola " . $_SESSION['nombre'] . ". Eres un usuario estándar."; break;
case 2: echo "Hola " . $_SESSION['nombre'] . ". Eres un usuario moderador."; break;
case 3: echo "Hola " . $_SESSION['nombre'] . ". Eres un administrador."; break;
default: echo "Nivel de acceso desconocido."; break;
}
?>
Función estandar para sesiones PHP
También podemos dotar a nuestra gestión de sesiones en PHP de una función estándar reusable para comprobar los diferentes niveles de acceso sin repetir tanto código:
<?php
session_start();
// Función estandar reusable
function checkAccess($minNivel) {
if (!isset($_SESSION['id']) || $_SESSION['nivel'] < $minNivel) {
header("Location: login.php");
exit;
}
}
// Comprobación en la página administradores
checkAccess(3);
echo "Acceso permitido: página de administración";
?>
Con estos ejemplos tienes la base para controlar la navegación y la visualización de contenido según niveles de usuario usando $_SESSION. Estas variables estarán disponibles en todas las páginas del sitio mientras la sesión esté activa y no se haya cerrado por ejemplo, con session_destroy().
Cerrar sesiones en PHP
Si en nuestra gestión de sesiones PHP crear una sesión es importante, también lo es el permitir que el usuario pueda cerrar su sesión voluntariamente. Para ello crearemos un archivo logout.php que elimine todas las variables de sesión y destruya la sesión completamente. El código es el siguiente:
<?php
session_start();
// Eliminar todas las variables de sesión
session_unset();
// Destruir la sesión
session_destroy();
// Redirigir al login
header("Location: login.php");
exit;
?>
session_unset()limpia todas las variables de sesión.session_destroy()elimina la sesión en el servidor.- Redirigimos al login para evitar quedarse en una página protegida tras cerrar sesión.
Gestión de sesiones en PHP
En este artículos hemos explicado como realizar la gestión de sesiones y control de acceso en nuestro sistema de login con PHP. Hemos visto cómo mantener activa la sesión del usuario entre páginas, cómo proteger el acceso a secciones internas y cómo diferenciar entre diferentes niveles de usuario, como admin, moderador o usuario estándar.
Para mejorar la gestión de sesiones en PHP y el control de acceso, sigue estas recomendaciones:
- Inicia la sesión siempre al principio de cada archivo PHP que requiera autenticación.
- Nunca muestres datos en HTML sin sanitizarlos con
htmlspecialchars(). - Usa
exitdespués de cada redirección, para evitar que el código siguiente se ejecute. - No confíes solo en el front-end: cualquier control de acceso debe verificarse en el servidor.
- Evita almacenar contraseñas o datos sensibles dentro de la sesión.
En el próximo artículo hablaremos en profundidad de un tema importante a tener siempre en cuenta: la seguridad del sistema de login, donde abordaremos HTTPS, encriptación, ataques XSS y CSRF, y cómo proteger nuestro sistema frente a intentos de intrusión.
¡ Espero que este artículo sea de vuestro interés !