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.
Interfaz Guard (Illuminate\Contracts\Auth\Guard)
Interfaz Guard (Illuminate\Contracts\Auth\Guard)
Interfaz StatefulGuard (Illuminate\Contracts\Auth\StatefulGuard)
Interfaz StatefulGuard (Illuminate\Contracts\Auth\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 deTokenGuard. 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 Para usar un guard concreto en un controlador o en el código, llama a
auth.Auth::guard('api') o auth('api').Guard sencillo mediante closure
ConAuth::viaRequest() puedes definir un guard simple usando solo una closure, sin crear una clase. Es adecuado para prototipos o autenticaciones muy sencillas.
config/auth.php:
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
providers de config/auth.php:
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.AppServiceProvider:
Pruebas
En los tests unitarios de un guard personalizado, mockea elUserProvider para comprobar el comportamiento del guard.
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.