GUÍA COMPLETA DE GUARDS EN LARAVEL: AUTENTICACIÓN PROFESIONAL
Los Guards son uno de los componentes más importantes y a la vez menos comprendidos del sistema de autenticación de Laravel. Dominarlos te permite manejar múltiples tipos de usuarios, APIs, paneles administrativos y aplicaciones multi-tenant de forma limpia y segura.Un Guard define cómo se autentica un usuario en una determinada parte de la aplicación. Es decir, responde a las preguntas:
- ¿Dónde buscar las credenciales del usuario? (¿Base de datos? ¿Sesión? ¿Token?)
- ¿Qué modelo Eloquent representa al usuario en este contexto?
- ¿Cómo mantener el estado de la autenticación? (Sesión, Token, Sanctum, Passport, etc.)
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token', // Antes de Laravel 11
'provider' => 'users',
],
],
Proveedores
Los guards trabajan junto a Providers, que definen qué modelo y tabla usar para recuperar los usuarios:'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
'admins' => [
'driver' => 'eloquent',
'model' => App\Models\Admin::class,
],
],
Guards más usados en proyectos reales
Configuración de un Guard personalizado (Multi-Auth)
Crear el modelo
php artisan make:model Admin -m
Configurar auth.php
'guards' => [
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
],
'providers' => [
'admins' => [
'driver' => 'eloquent',
'model' => App\Models\Admin::class,
],
],
Middleware específico
// En Kernel.php (Laravel 11+ usa bootstrap/app.php)
protected $middlewareAliases = [
'auth.admin' => \Illuminate\Auth\Middleware\Authenticate::class . ':admin',
];
Rutasphp
Route::prefix('admin')->middleware('auth:admin')->group(function () {
Route::get('/dashboard', [AdminDashboardController::class, 'index']);
});
Uso práctico del Guard
// Obtener el guard actual
$guard = Auth::getDefaultDriver(); // 'web' o 'admin'
// Usar un guard específico
if (Auth::guard('admin')->attempt($credentials)) {
return redirect()->route('admin.dashboard');
}
// Usuario autenticado en un guard específico
$user = Auth::guard('admin')->user();
// Verificar si está autenticado en un guard
if (Auth::guard('admin')->check()) { ... }
Crear un Guard personalizado (Driver propio)
A veces se necesita algo totalmente distinto (autenticación por JWT manual, por header personalizado, etc.).// App/Providers/AuthServiceProvider.php
public function boot()
{
Auth::extend('jwt', function ($app, $name, array $config) {
return new JwtGuard(
Auth::createUserProvider($config['provider']),
$app['request']
);
});
}
'guards' => [
'jwt' => [
'driver' => 'jwt',
'provider' => 'users',
],
],
Ejemplo completo
Sistema con Usuarios y Admins:// Login de admin
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
if (Auth::guard('admin')->attempt($credentials)) {
$request->session()->regenerate();
return redirect()->intended('admin/dashboard');
}
return back()->withErrors(['email' => 'Credenciales incorrectas']);
}
Buenas prácticas
- Usar Laravel Sanctum para la mayoría de APIs, solución recomendada actualmente.
- Evitar crear demasiados guards. Muchas veces es mejor usar un solo modelo User con roles (Spatie Permission o Gate).
- Separa bien los guards de sesión (web) de los guards de API.
- Nunca usar el mismo guard para usuarios normales y administradores si tienen permisos muy distintos.
- Usar Laravel Fortify o Jetstream como base y extiéndelos cuando necesites multi-auth.