Autorización y autenticación en PHP: guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Autorización y autenticación en PHP: desde lo básico hasta la protección

La seguridad de las aplicaciones web comienza con la correcta implementación de la autenticación (verificación de la identidad del usuario) y la autorización (verificación de sus permisos de acceso). En PHP, estos mecanismos se pueden implementar tanto con funciones integradas como utilizando bibliotecas especializadas. En este artículo, analizaremos los conceptos clave, escribiremos ejemplos de código y revisaremos las mejores prácticas de seguridad.



1. Conceptos básicos: autenticación vs autorización

Antes de escribir código, es importante diferenciar claramente los dos términos:

  • Autenticación — proceso de verificar que el usuario es quien dice ser (generalmente mediante usuario y contraseña).
  • Autorización — proceso de determinar qué recursos o acciones están disponibles para un usuario autenticado (por ejemplo, el rol "admin" o "user").

Los errores en la implementación de cualquiera de estas etapas pueden provocar fugas de datos o acceso no autorizado.



2. Autenticación básica mediante sesiones (PHP nativo)

La forma más común es el uso de sesiones. PHP proporciona el mecanismo integrado $_SESSION. Veamos un ejemplo sencillo.



Paso 1: Formulario de inicio de sesión (login.php)

<?phpsession_start();?><!DOCTYPE html><html><head>    <title>Inicio de sesión</title></head><body>    <form method="POST" action="login.php">        <label>Usuario:</label>        <input type="text" name="username" required>        <label>Contraseña:</label>        <input type="password" name="password" required>        <button type="submit" name="login">Iniciar sesión</button>    </form></body></html>


Paso 2: Procesamiento del inicio de sesión (mismo login.php)

<?phpsession_start();require_once 'db.php'; // conexión a la BD

if (isset($_POST['login'])) { $username = trim($_POST['username']); $password = $_POST['password'];

// 1. Consulta preparada para protegerse contra inyecciones SQL $stmt = $pdo->prepare("SELECT id, password_hash FROM users WHERE username = ?"); $stmt->execute([$username]); $user = $stmt->fetch();

// 2. Verificación de la contraseña mediante password_verify if ($user && password_verify($password, $user['password_hash'])) { // Autenticación exitosa $_SESSION['user_id'] = $user['id']; $_SESSION['logged_in'] = true; header("Location: dashboard.php"); exit; } else { $error = "Usuario o contraseña incorrectos"; }}?>


Paso 3: Verificación de autorización en una página protegida

<?phpsession_start();if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) {    header("Location: login.php");    exit;}// Acceso permitidoecho "Bienvenido, usuario #" . htmlspecialchars($_SESSION['user_id']);?>


3. Hash de contraseñas: nunca almacene contraseñas en texto plano

PHP proporciona funciones seguras para trabajar con contraseñas:

  • password_hash($password, PASSWORD_BCRYPT) — crea un hash con sal automáticamente.
  • password_verify($password, $hash) — verifica la contraseña contra el hash.

Ejemplo de registro de usuario:

<?php$password = "user123";$hash = password_hash($password, PASSWORD_BCRYPT);// Guardamos $hash en la base de datos$stmt = $pdo->prepare("INSERT INTO users (username, password_hash) VALUES (?, ?)");$stmt->execute([$username, $hash]);?>

Importante: nunca use md5() o sha1() para contraseñas — están obsoletos y son fáciles de descifrar.



4. Autorización basada en roles (Role-Based Access Control)

Para la diferenciación de permisos

Recommendations