Autenticación
Autenticación
La autenticación es el proceso de verificar la identidad de un usuario que intenta acceder a una aplicación.
Su gestión debe de ser cuidadosa y correctapara proteger la información sensible y a mantener la integridad y privacidad de los datos de los usuarios.
Además, siempre debemos tener en cuenta que estamos gestionando datos confidenciales de las entidades que se registran. Es fundamental respetar los principios de privacidad de datos y asegurarnos de cumplir con las normativas y mejores prácticas en protección de datos.
Opciones de Autenticación en Laravel
Laravel ofrece varias opciones para implementar la autenticación en una aplicación, cada una con sus propias características y casos de uso.
Cuando instalamos un nuevo proyecto de Laravel (usando Laravel 11 con el instalador de Laravel, no Composer), se nos plantea si queremos iniciar con uno de los stacks Breeze o Jetstream.
A continuación, comentamos estos paquetes y otros disponibles, así como sus posibles combinaciones.
Paquetes o Stacks Disponibles
- Breeze: Proporciona una implementación de autenticación simple y ligera, con vistas y controladores preconfigurados.
- Fortify: Implementación de backend . No incluye vistas predeterminadas.
- Sanctum: Proporciona una solución ligera para la autenticación de API.
- Jetstream: incluye Fortify y otras opciones además de posibilidad de frontend .
- Passport: Proporciona una implementación completa de OAuth2 para la autenticación de API.
- Socialite: autenticación social, permitiendo a los usuarios iniciar sesión utilizando proveedores de identidad como Facebook, Google, Twitter, etc.
Vamos a hacer una descripción sencilla pero un poco más detallada
1. Laravel Breeze
Descripción: Laravel Breeze es una solución de autenticación simple y ligera que incluye vistas, controladores y rutas preconfiguradas. Está diseñado para proyectos pequeños y medianos donde se necesita una configuración rápida y sencilla.
Características:
- Configuración rápida y sencilla.
- Proporciona vistas y controladores básicos para la autenticación.
- Ideal para aplicaciones pequeñas o prototipos.
2. Laravel Fortify
Descripción: Laravel Fortify es una implementación de backend para la autenticación de Laravel. Proporciona la funcionalidad básica de autenticación como inicio de sesión, registro, restablecimiento de contraseñas, verificación de correo electrónico y autenticación de dos factores, pero no incluye vistas predeterminadas.
Características:
- Mayor flexibilidad para crear tus propias vistas y lógica de frontend.
- Ideal para proyectos donde deseas un control completo sobre el diseño y la experiencia del usuario.
3. Laravel Jetstream
Descripción: Laravel Jetstream es un paquete más completo que incluye todas las características de Fortify, además de gestión de equipos, perfiles de usuario y administración de sesiones. Ofrece dos opciones de frontend: Livewire (Blade) y Inertia.js (Vue.js).
Características:
- Proporciona un conjunto completo de características listas para usar.
- Incluye gestión de equipos, perfiles de usuario y administración de sesiones.
- Opciones de frontend con Livewire y Inertia.js.
- Ideal para aplicaciones complejas que requieren funcionalidad avanzada.
4. Laravel Sanctum
Descripción: Laravel Sanctum proporciona una solución ligera para la autenticación de API, tokens API simples y autenticación basada en cookies para aplicaciones SPA (Single Page Applications).
Características:
- Tokens API simples sin la complejidad de OAuth.
- Autenticación basada en cookies para SPAs.
- Ideal para aplicaciones que necesitan autenticación de API sencilla.
5. Laravel Socialite
Descripción: Laravel Socialite es una solución para la autenticación social, permitiendo a los usuarios iniciar sesión utilizando proveedores de identidad como Facebook, Google, Twitter, etc.
Características:
- Fácil integración con proveedores de identidad social.
- Manejo sencillo de OAuth.
- Ideal para aplicaciones que desean permitir a los usuarios iniciar sesión con sus cuentas de redes sociales.
6. Laravel Passport
Descripción: Laravel Passport proporciona una solución completa de OAuth2 para la autenticación de API. Es ideal para aplicaciones que necesitan un control detallado sobre los tokens de acceso y la autenticación de terceros.
Características:
- Implementación completa de OAuth2.
- Administración avanzada de tokens de acceso.
- Ideal para aplicaciones que necesitan autenticación de API robusta y segura.
Combinaciones y Agrupaciones
Algunas de estas opciones pueden ser combinadas entre sí, mientras que otras son mutuamente excluyentes.
Agrupaciones Compatibles:
-
Jetstream + Fortify:
- Jetstream utiliza Fortify como backend de autenticación.
- Incluye características avanzadas como gestión de equipos y administración de sesiones.
-
Fortify + Sanctum:
- Fortify puede manejar la autenticación de usuarios.
- Sanctum puede proporcionar tokens API para la autenticación de aplicaciones SPA.
-
Jetstream + Sanctum:
- Jetstream, que ya utiliza Fortify, puede integrarse con Sanctum para manejar tokens API y autenticación basada en cookies para SPAs.
-
Fortify + Socialite:
- Fortify maneja la autenticación básica.
- Socialite permite la autenticación social mediante proveedores de identidad.
-
Jetstream + Socialite:
- Jetstream (con Fortify) maneja la autenticación básica y avanzada.
- Socialite permite la autenticación social mediante proveedores de identidad.
-
Fortify + Passport:
- Fortify maneja la autenticación de usuarios.
- Passport proporciona una implementación completa de OAuth2 para la autenticación de API.
-
Jetstream + Passport:
- Jetstream (con Fortify) maneja la autenticación básica y avanzada.
- Passport proporciona una implementación completa de OAuth2 para la autenticación de API.
Agrupaciones Mutuamente Excluyentes:
- Breeze y Jetstream:
- Breeze y Jetstream son paquetes de inicio que proporcionan configuraciones completas de autenticación, por lo que no se utilizan juntos.
- Breeze es para una configuración rápida y sencilla, mientras que Jetstream ofrece más funcionalidades avanzadas.
- Sanctum y Passport:
- Ambos proporcionan soluciones para la autenticación de API, pero con enfoques diferentes. Sanctum es ideal para aplicaciones más ligeras y sencillas, mientras que Passport ofrece una implementación completa de OAuth2 para necesidades más complejas.
- No se utilizan juntos ya que ambos manejan la autenticación de API de maneras diferentes y no complementarias.
Resumen
Cada una de estas opciones ofrece diferentes niveles de funcionalidad y complejidad. La elección de la solución de autenticación adecuada depende de las necesidades específicas de tu aplicación y del nivel de control que desees tener sobre el proceso de autenticación.
- Laravel Breeze: Para una implementación rápida y sencilla.
- Laravel Fortify: Para control completo sobre el backend de autenticación.
- Laravel Jetstream: Para una solución completa con funcionalidades avanzadas.
- Laravel Sanctum: Para autenticación de API sencilla.
- Laravel Socialite: Para autenticación social.
- Laravel Passport: Para autenticación de API robusta y segura.
1 - Instalación
Instalando breeze
Qué hacemos en este proceso de instalación
composer require laravel/breeze --dev
Este comando:
- Descarga el paquete laravel/breeze como dependencia de desarrollo
- No crea aún ningún archivo de autenticación
- Añade al proyecto los comandos necesarios para generar el sistema de login
En este punto, el proyecto sigue siendo funcionalmente igual; Breeze solo está disponible para ser instalado.
php artisan breeze:install
Este es el comando clave del proceso.
Al ejecutarlo, Laravel:
- Copia controladores de autenticación al proyecto
- Genera vistas Blade para login, registro, recuperación de contraseña, etc.
- Añade rutas de autenticación en el sistema de rutas
- Configura el uso de Tailwind y Alpine
- Publica componentes Blade reutilizables
Durante la ejecución, Breeze puede preguntar por el stack a utilizar (Blade, React, Vue, API, etc.).
Si no se especifica nada, se instala el stack Blade por defecto.
Este comando:
- Ejecuta las migraciones de base de datos
- Crea, entre otras, la tabla users necesaria para la autenticación
- Deja el sistema preparado para registrar y autenticar usuarios reales
Sin este paso, el login no funcionaría porque no existirían las tablas necesarias.
Este comando:
- Instala las dependencias frontend definidas en package.json
- Incluye Tailwind CSS, Vite y otras herramientas necesarias
- Prepara el entorno para compilar los assets
Es imprescindible tras instalar Breeze, ya que se añaden dependencias nuevas.
Advertencia sobre Tailwind 4 y Breeze
Laravel Breeze, por defecto, está preparado para funcionar con Tailwind CSS 3.
Aun así, es posible forzar el proyecto para usar Tailwind CSS 4, pero debes asumir que:
- No es un camino “oficial” en Breeze.
- Puede haber pequeños fallos visuales en algunas vistas (normalmente mínimos y fáciles de ajustar).
- El mayor riesgo es dejar el proyecto en un estado “híbrido” (Tailwind 4 + PostCSS antiguo), lo que rompe Vite.
Qué ocurre al instalar Breeze
Después de ejecutar php artisan breeze:install suelen ocurrir estos cambios:
-
Se sobreescriben o regeneran rutas
Breeze necesita añadir rutas de autenticación. Si tu routes/web.php estaba personalizado, revisa cambios y recupera tu contenido si fuese necesario.
-
Se instalan controladores, vistas y rutas de autenticación
Se generan (o se añaden) controladores de autenticación, vistas Blade y rutas para:
login, register, logout, forgot password, reset password, email verification, etc.
-
Se instala Tailwind 3 y se modifica el frontend
Breeze añade dependencias y ficheros del stack frontend (Tailwind 3 por defecto).
Esto puede implicar que tu resources/css/app.css se reemplace o se ajuste para Tailwind 3.
Migrar el proyecto a Tailwind 4 (mínimo y limpio)
Objetivo: dejar el proyecto en un estado coherente con Tailwind 4:
- Tailwind 4
- Sin PostCSS
- Sin autoprefixer
- Vite usando el plugin
@tailwindcss/vite
- CSS usando
@import "tailwindcss";
1) Eliminar PostCSS del proyecto
Borra el fichero de configuración de PostCSS (si existe):
Nota: Si este fichero existe, Vite intentará cargar PostCSS y fallará si no tienes autoprefixer.
2) Ajustar dependencias (package.json)
Asegúrate de que NO existan estas dependencias en devDependencies del fichero
package.json
. Puedes borrar directamente esas líneas:
postcss
autoprefixer
tailwindcss versión 3
Instala Tailwind 4 y el plugin oficial para Vite:
tailwindcss
@tailwindcss/vite
- npm install -D tailwindcss@latest @tailwindcss/vite
-
tailwindcss@latest:
Instala la versión más reciente de Tailwind (actualmente 4.x).
-
@tailwindcss/vite
Es imprescindible para Tailwind 4. Sustituye completamente a PostCSS con autoprefixer.
-
-D (–save-dev)
Tailwind es una dependencia de desarrollo. (En producción, ya se transpila al css
3) Limpiar instalación de npm y reinstalar
Elimina dependencias instaladas y el lockfile, y reinstala:
rm -rf node_modules package-lock.json
npm install
- borrar
node_modules
- borrar
package-lock.json
- ejecutar
npm install
Esto evita que queden restos de Tailwind 3 o PostCSS en caché.
4) Configurar Vite para Tailwind 4
En vite.config.js añade el plugin:
- importar
tailwindcss desde @tailwindcss/vite
- incluir
tailwindcss() en plugins
Debe quedar (estructura):
export default defineConfig({
plugins: [
laravel({
// Lo que hubiera
}),
tailwindcss(),
],
});
En Tailwind 4 NO se usan directivas clásicas @tailwind ...;.
El contenido mínimo recomendado es:
6) Ejecutar Vite
Finalmente:
Si Vite arranca sin errores, Tailwind 4 está funcionando.
Nota sobre estilos “raros” tras la migración
Recuerda que estás usando tailwind en versión 4 y podría ser que alguna vista, algún componente tenga algún detall de estilo diferente en la versión 3:
- No es un fallo de Laravel.
- Es un cambio esperado por las diferencias entre Tailwind 3 y Tailwind 4.
- Normalmente se corrige ajustando clases concretas en las vistas de Breeze.
Limpieza paso a paso (checklist rápida)
- Borrar
postcss.config.js
- Quitar
postcss y autoprefixer de package.json
- Sustituir Tailwind 3 por Tailwind 4
rm -rf node_modules package-lock.json
npm install
- Configurar
vite.config.js con @tailwindcss/vite
- Cambiar
app.css a @import "tailwindcss";
npm run dev
Opción alternativa: iniciar el proyecto directamente con Breeze
Laravel permite crear un proyecto nuevo e instalar Breeze desde el inicio usando un parámetro
laravel new proyecto --breeze
Actualmente en el proceso de instalación es habitual que nos pregunte si queremos disponer de esta librería en nuestro proyecto.
Con esta opción:
- Breeze se instala automáticamente durante la creación del proyecto
- Se generan directamente las vistas, controladores y rutas
- Aun así, será necesario ejecutar migrate y npm install / npm run dev
Esta opción es útil cuando se sabe desde el principio que el proyecto necesitará autenticación básica.
Usando docker para la bd
Redirección una vez autenticado con Laravel Breeze
En Laravel Breeze, la redirección después de autenticarse se gestiona en el controlador AuthenticatedSessionController. Este controlador define el comportamiento de inicio de sesión y la redirección predeterminada.
Ubicación del Controlador
El controlador se encuentra en la siguiente ruta del proyecto:
1
|
app/Http/Controllers/Auth/AuthenticatedSessionController.php
|
Modificar la Redirección
Para cambiar la ruta a la que se redirige al usuario después de iniciar sesión, edita el método store del controlador. Este es el fragmento relevante:
1
2
3
4
5
6
7
8
|
public function store(Request $request): RedirectResponse
{
$request->authenticate();
$request->session()->regenerate();
return redirect()->intended('/dashboard'); // Cambia '/dashboard' por tu ruta deseada
}
|
redirect()->intended('/dashboard'): Lleva al usuario a la página protegida que intentaba acceder antes de iniciar sesión.
- Si no hay una página pendiente, lo redirige a la ruta
/dashboard.
Ejemplo Práctico
Si deseas redirigir al usuario a una página personalizada, por ejemplo, /inicio, modifica la línea de redirección:
1
|
return redirect()->intended('/inicio');
|
Nota importante
Si estás utilizando middleware como auth, asegúrate de que la ruta de destino esté protegida para evitar accesos no autorizados.
Referencias
Fuentes de Información
Redirección después de registro con Laravel Breeze
En Laravel Breeze, la redirección después de que un usuario se registre se gestiona en el controlador RegisteredUserController. Este controlador define el comportamiento para registrar nuevos usuarios y, al completarse, redirigirlos a una página específica.
Ubicación del Controlador
El controlador se encuentra en la siguiente ruta dentro del proyecto:
1
|
app/Http/Controllers/Auth/RegisteredUserController.php
|
Modificar la Redirección
Para cambiar la redirección una vez que el usuario se registre, edita el método store en el controlador. Este es el fragmento relevante:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public function store(Request $request): RedirectResponse
{
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
event(new Registered($user));
Auth::login($user);
return redirect('/dashboard'); // Cambia '/dashboard' por tu ruta deseada
}
|
return redirect('/dashboard'): Indica a dónde será redirigido el usuario después de registrarse.
- Puedes cambiar
/dashboard por cualquier ruta que desees, como /welcome o /inicio.
Ejemplo Práctico
Si deseas redirigir a los usuarios recién registrados a una página de bienvenida personalizada (/welcome), edita el método de la siguiente manera:
1
|
return redirect('/welcome');
|
Nota Adicional
La autenticación del usuario tras el registro está integrada en el método Auth::login($user). Esto asegura que el usuario esté autenticado inmediatamente después de registrarse y sea redirigido a la página deseada.
Nota importante
Si usas middleware como auth para proteger las rutas, asegúrate de que la ruta de redirección esté correctamente configurada para usuarios autenticados.
2 - auth: Vistas y Controladores
Autenticación en Laravel (Breeze)
Control de acceso con directivas Blade, middleware y obtención del usuario autenticado.
Directivas Blade: @auth y @guest
Laravel proporciona directivas específicas para comprobar si el usuario está autenticado.
@auth
Renderiza el contenido solo si el usuario está autenticado.
@auth
<p>Bienvenido {{ auth()->user()->name }}</p>
@endauth
Equivalente interno:
if (auth()->check()) {
// usuario autenticado
}
@guest
Renderiza el contenido solo si NO hay usuario autenticado.
@guest
<a href="{{ route('login') }}">Login</a>
<a href="{{ route('register') }}">Register</a>
@endguest
Equivalente interno:
if (!auth()->check()) {
// usuario no autenticado
}
Middleware auth en rutas
El middleware protege rutas para que solo accedan usuarios autenticados.
En routes/web.php
Route::get('/dashboard', function () {
return view('dashboard');
})->middleware('auth');
Agrupando rutas
Route::middleware('auth')->group(function () {
Route::get('/profile', [ProfileController::class, 'edit']);
Route::get('/settings', [SettingsController::class, 'index']);
});
Si el usuario no está autenticado:
- Laravel redirige automáticamente a
/login.
Obtener el usuario autenticado en un Controller
Alternativa con Request
public function index(Request $request)
{
$user = $request->user();
}
¿Qué ocurre si no hay usuario autenticado?
Si la ruta NO está protegida con middleware:
$user = auth()->user(); // devuelve null si no está autenticado
Por eso es recomendable:
if (auth()->check()) {
$user = auth()->user();
}
Resumen conceptual
@auth → Mostrar contenido solo si hay usuario autenticado.
@guest → Mostrar contenido solo si NO hay usuario autenticado.
middleware('auth') → Protege rutas o controladores.
auth()->user() → Devuelve el usuario autenticado o null.
Laravel centraliza la autenticación mediante:
- Guards
- Middleware
- Facade
Auth
- Helper
auth()
Esto permite mantener el código limpio y coherente en toda la aplicación.
¿Qué es un Guard en Laravel? (Explicación básica)
Un Guard es el mecanismo que Laravel usa para saber:
¿Quién está autenticado y cómo lo he autenticado?
Es decir, el guard decide:
- DÓNDE se guarda la información del login
- CÓMO se comprueba si un usuario está autenticado
Comparaitiva para mejor comprensión
Imagina que Laravel es un edificio con varias puertas.
Cada puerta tiene un sistema diferente para comprobar la identidad:
- 🔑 Una puerta usa sesiones (login clásico con formulario)
- 🔐 Otra puerta usa tokens API
- 🪪 Otra podría usar JWT
- 🧩 Otra podría usar autenticación externa
Cada sistema de acceso es un Guard.
El Guard por defecto
En aplicaciones web normales (con Breeze), Laravel usa el guard:
Web
Este guard:
- Usa sesiones
- Guarda el usuario autenticado en la sesión
- Funciona con login tradicional (email + password)
Está definido en:
¿Por qué existen varios Guards?
Porque una misma aplicación puede tener:
- 👤 Usuarios normales (web)
- 🤖 API externa con tokens
- 👨🏫 Panel admin separado
- 📱 App móvil con autenticación diferente
Cada tipo puede usar un guard distinto.
Ejemplo típico:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
]
Acciones de un guard
Un guard se encarga de:
- Comprobar si hay usuario autenticado
- Recuperar el usuario actual
- Validar credenciales
- Gestionar login / logout
Guard Vs Provider
- Guard → Cómo se autentica
- Provider → De dónde salen los usuarios (tabla users, otra tabla, etc.)
Resumen
🔐 Guard = Sistema de autenticación
👤 Provider = Fuente de usuarios
🧾 Middleware auth = Filtro que obliga a estar autenticado
En nuestros proyectos usaremos
- Guard: web
- Driver: session
- Provider: users
Y funcionará automáticamente.
No tenéis que tocar nada hasta que trabajéis con APIs o múltiples tipos de autenticación.