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.)
Laravel trae dos guards, por defecto, principales en "config/auth.php":

'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

Guard Driver Uso Recomendado Recomendado con
web session Aplicaciones web tradicionales Breeze / Jetstream
api sanctum APIs + SPAs (Vue, React, Livewire) Laravel Sanctum
admin session Paneles administrativos Multi-auth
customer sanctum Aplicaciones multi-tenant Tenancy
passport passport OAuth2 (cuando se necesita) Laravel Passport

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']
        );
    });
}
Luego en "config/auth.php":

'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.