Skip to main content

Estructura interna del sistema de autenticación de Laravel

La facade Auth y AuthManager

La facade Auth es un proxy de Illuminate\Auth\AuthManager. AuthManager gestiona varios guards siguiendo el patrón driver y crea/cachea la instancia de guard correspondiente basándose en la configuración de config/auth.php.
resolve() lee la clave driver desde el array guards de config/auth.php e invoca la factory closure correspondiente. Los drivers integrados session y token también están registrados mediante este mismo mecanismo.

Diferencia entre las interfaces Guard y StatefulGuard

Un guard de autenticación de Laravel debe implementar como mínimo Illuminate\Contracts\Auth\Guard. Si necesita mantener sesión, implementa StatefulGuard.
StatefulGuard extiende Guard y añade los métodos necesarios para mantener el estado de login mediante sesiones y cookies.
Los guards que no requieren sesión (autenticación de API o mediante tokens propios) solo necesitan implementar Guard. Si necesitas sesión, como en el login de administradores, implementa StatefulGuard.

Implementar un guard personalizado

El trait GuardHelpers

Como los métodos check(), guest(), id() y hasUser() de la interfaz Guard suelen tener casi la misma implementación, Laravel proporciona el trait Illuminate\Auth\GuardHelpers. Con él, los únicos métodos que quedan obligatorios son user() y validate().

Ejemplo de guard de autenticación por token de API

Vamos a implementar un guard sencillo por token de API inspirado en el diseño de TokenGuard. Recupera el token desde una cabecera o un parámetro de la petición y resuelve el usuario a través del UserProvider.
1

Crea la clase del guard

Crea el guard en el directorio app/Auth.
2

Registra el guard en un service provider

Registra el guard con Auth::extend() en el método boot() de AppServiceProvider.
Auth::createUserProvider() lee la configuración providers de config/auth.php y devuelve la instancia de UserProvider correspondiente. Salvo que crees tu propio provider, esta llamada te permite reutilizar el EloquentUserProvider estándar.
3

Configura el guard en config/auth.php

Añade el nuevo guard en config/auth.php.
4

Aplica el guard a las rutas

Indica el nombre del guard en el middleware auth.
Para usar un guard concreto en un controlador o en el código, llama a Auth::guard('api') o auth('api').

Guard sencillo mediante closure

Con Auth::viaRequest() puedes definir un guard simple usando solo una closure, sin crear una clase. Es adecuado para prototipos o autenticaciones muy sencillas.
Configuración en config/auth.php:
Los guards definidos con Auth::viaRequest() no utilizan UserProvider, así que métodos del provider como retrieveById() no funcionan. En producción se recomienda un guard basado en clases mediante Auth::extend().

Implementar un UserProvider personalizado

Si necesitas obtener los datos del usuario desde una fuente que no sea la base de datos (una API externa, LDAP, etc.), implementa la interfaz Illuminate\Contracts\Auth\UserProvider.

Registro del UserProvider personalizado

Añádelo en la sección providers de config/auth.php:
Combina el guard con el provider:

Casos de uso prácticos

Autenticación múltiple (guards diferentes para administradores y usuarios normales)

1

Crea el modelo de administrador

Prepara un modelo Eloquent para el administrador. Con la herencia de Authenticatable, se integra en el sistema Auth.
2

Configura config/auth.php

3

Configura rutas y middleware

4

Escribe el proceso de login indicando el guard

Autenticación contra una API externa con tokens JWT

Ejemplo de un guard personalizado que usa un servicio externo de autenticación JWT.
Registro en AppServiceProvider:
Puedes acceder también a métodos específicos del guard personalizado, como en Auth::guard('jwt')->payload(). Lo que devuelve Auth::guard() es la instancia del guard, así que también puedes invocar métodos que no estén en la interfaz.

Pruebas

En los tests unitarios de un guard personalizado, mockea el UserProvider para comprobar el comportamiento del guard.
En los tests de funcionalidad puedes usar ActingAs para autenticar un usuario en un guard concreto.

Páginas relacionadas

Autenticación (introducción)

Revisa los starter kits y el flujo de autenticación estándar.

Contenedor de servicios

Entiende el funcionamiento del contenedor de servicios que se usa al registrar guards.
Última modificación el 13 de julio de 2026