10.2-Explicación Completa de la Autenticación en Laravel
- Obtener vínculo
- X
- Correo electrónico
- Otras apps
Explicación Completa de la Autenticación en Laravel
Voy a explicarte qué es la autenticación, cómo funciona en Laravel y cómo la integramos en tu proyecto de gestor de tareas.
🔐 ¿Qué es la Autenticación?
Autenticación es el proceso de verificar quién eres. Es como mostrar tu identificación:
Login/Registro = Mostrar tu ID y que te verifiquen
Sesión = Tu pase de acceso temporal
Middleware auth = El guardia que verifica tu pase
🏗️ Cómo Funciona la Autenticación en Laravel
1. Estructura Básica
usuarios (tabla en BD)
├── id
├── name
├── email
├── password (encriptado)
└── remember_token
sesión (almacenada en cookies/BD/cache)
├── user_id
├── identificador único
└── fecha expiración2. Flujo de Autenticación
1. Usuario envía email/contraseña → [Laravel]
2. Laravel busca usuario en BD → [Base de Datos]
3. Verifica contraseña (hash) → [Seguridad]
4. Crea sesión → [Cookie/Sesión]
5. Redirige a área protegida → [Middleware]🛠️ Cómo Integramos la Autenticación en Tu Proyecto
PASO 1: Instalación del Sistema de Autenticación
composer require laravel/ui
php artisan ui bootstrap --authEsto genera automáticamente:
app/Http/Controllers/Auth/ # Controladores de auth
├── LoginController.php
├── RegisterController.php
├── ForgotPasswordController.php
└── ResetPasswordController.php
resources/views/auth/ # Vistas de auth
├── login.blade.php
├── register.blade.php
├── verify.blade.php
└── passwords/
├── email.blade.php
└── reset.blade.php
routes/web.php # Rutas añadidas
Auth::routes(); # ← Esta línea añade todas las rutasPASO 2: La Migración de Usuarios
database/migrations/2014_10_12_000000_create_users_table.php:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id(); // ID único
$table->string('name'); // Nombre
$table->string('email')->unique(); // Email único
$table->timestamp('email_verified_at')->nullable(); // Verificación
$table->string('password'); // Contraseña ENCRIPTADA
$table->rememberToken(); // Para "Recuérdame"
$table->timestamps(); // created_at, updated_at
});
}Características de seguridad:
passwordse almacena encriptado (hash bcrypt)email_verified_atpermite verificación por emailremember_tokenpara sesiones persistentes
PASO 3: El Modelo User
app/Models/User.php:
class User extends Authenticatable
{
use HasFactory, Notifiable;
// Campos que se pueden llenar
protected $fillable = [
'name',
'email',
'password',
];
// Campos ocultos (no se muestran en JSON)
protected $hidden = [
'password',
'remember_token',
];
// Conversiones automáticas
protected $casts = [
'email_verified_at' => 'datetime',
];
}PASO 4: Middleware de Autenticación
El guardián de las rutas:
// En routes/web.php
Route::middleware(['auth'])->group(function () {
// Solo usuarios autenticados pueden acceder aquí
Route::resource('tareas', TareaController::class);
});
// ¿Qué hace el middleware 'auth'?
// 1. Verifica si hay un usuario logueado
// 2. Si NO hay usuario → redirige a /login
// 3. Si HAY usuario → permite el accesoPASO 5: Relación Usuario-Tareas
La clave de la personalización:
// En la migración de tareas
$table->foreignId('user_id')->constrained()->onDelete('cascade');
// Esto significa:
// 1. Cada tarea tiene un user_id
// 2. Este user_id DEBE existir en la tabla users
// 3. Si se borra un usuario → se borran sus tareas (cascade)En el modelo Tarea:
public function user()
{
// "Esta tarea pertenece a un usuario"
return $this->belongsTo(User::class);
}En el modelo User:
public function tareas()
{
// "Este usuario tiene muchas tareas"
return $this->hasMany(Tarea::class);
}PASO 6: Filtrando Tareas por Usuario
El cambio más importante en TareaController.php:
// ANTES (sin auth):
public function index()
{
$tareas = Tarea::all(); // ¡Muestra TODAS las tareas!
return view('tareas.index', compact('tareas'));
}
// DESPUÉS (con auth):
public function index()
{
// Solo tareas del usuario actual
$tareas = Auth::user()->tareas()->latest()->get();
return view('tareas.index', compact('tareas'));
}¿Qué hace Auth::user()?
Devuelve el objeto del usuario actualmente autenticado
Si no hay usuario logueado → devuelve
nullPodemos acceder a sus propiedades:
Auth::user()->name,Auth::user()->email, etc.
PASO 7: Protección de Acceso Individual
Asegurando que cada usuario solo vea SUS tareas:
public function show(Tarea $tarea)
{
// Verifica si el usuario actual es el dueño de la tarea
if ($tarea->user_id !== Auth::id()) {
// Si NO es el dueño → error 403 (Prohibido)
abort(403, 'No tienes permiso para ver esta tarea');
}
return view('tareas.mostrar', compact('tarea'));
}¿Por qué esto es importante?
Imagina que la URL es: http://localhost/tareas/5
Usuario A creó la tarea 5 → puede verla
Usuario B intenta ver
/tareas/5→ ¡ERROR 403!Sin esta protección, Usuario B podría ver tareas ajenas
PASO 8: Vistas con Estado de Autenticación
En Blade podemos verificar el estado del usuario:
<!-- Verifica si el usuario está autenticado -->
@auth
<p>¡Hola {{ Auth::user()->name }}!</p>
<a href="{{ route('tareas.index') }}">Mis Tareas</a>
@endauth
<!-- Verifica si el usuario es un invitado (no autenticado) -->
@guest
<a href="{{ route('login') }}">Iniciar Sesión</a>
<a href="{{ route('register') }}">Registrarse</a>
@endguest🔑 Métodos Importantes del Facade Auth
// Obtener el usuario actual
$user = Auth::user();
$userId = Auth::id();
// Verificar autenticación
if (Auth::check()) {
// Usuario está logueado
}
// Autenticar manualmente
Auth::attempt([
'email' => $request->email,
'password' => $request->password
]);
// Cerrar sesión
Auth::logout();
// Obtener usuario sin middleware
$user = Auth::guard('web')->user();🛡️ Seguridad Integrada
Laravel incluye automáticamente:
Hash de contraseñas (bcrypt por defecto)
php// Cuando creas un usuario: User::create([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password) // ← ¡ENCRIPTADA! ]);Protección CSRF (tokens en formularios)
html@csrf <!-- Genera token único para cada formulario -->Protección XSS (Blade escapa automáticamente)
php{{ $variable }} <!-- Seguro - escapa HTML --> {!! $variable !!} <!-- Peligroso - no escapa (solo si confías) -->Rate Limiting (límite de intentos de login)
php// En LoginController protected $maxAttempts = 5; // 5 intentos máximo protected $decayMinutes = 1; // Bloqueo de 1 minuto
📊 Flujo Completo del Sistema
USUARIO NO REGISTRADO:
1. Visita /register → Crea cuenta → Redirige a /home
2. O visita /login → Inicia sesión → Redirige a /home
USUARIO REGISTRADO:
1. Va a /tareas → Middleware auth verifica sesión
2. Si válido → muestra SUS tareas
3. Si inválido → redirige a /login
PROTECCIÓN DE DATOS:
1. Usuario A ve /tareas → solo ve sus tareas
2. Usuario A intenta ver /tareas/15 (de Usuario B) → Error 403
3. Cada operación verifica: ¿user_id == Auth::id()?🎯 Beneficios de la Autenticación en Tu Proyecto
Privacidad: Cada usuario solo ve sus propias tareas
Seguridad: Nadie puede acceder a datos ajenos
Personalización: Puedes agregar "Mi Perfil", "Mis Estadísticas", etc.
Escalabilidad: Fácil agregar roles (admin, usuario normal) después
🔧 Posibles Mejoras Futuras
// 1. Roles y permisos (usando paquete Spatie)
$user->assignRole('admin');
$user->can('delete_tasks');
// 2. Autenticación social (Google, Facebook)
// Usando Socialite package
// 3. API con tokens (para apps móviles)
$token = $user->createToken('api-token');
// 4. Verificación de email
$user->sendEmailVerificationNotification();❓ Preguntas Comunes
¿Dónde se almacenan las sesiones?
Por defecto: en archivos (
storage/framework/sessions)Puedes cambiar a: base de datos, Redis, etc.
¿Cómo funciona "Recuérdame"?
Laravel crea un
remember_tokenen la tabla usersAlmacena cookie por 5 años (configurable)
Permite sesiones persistentes
¿Es seguro almacenar passwords en la BD?
SÍ, porque se almacenan como HASH (bcrypt)
Ejemplo: "miContraseña123" → "$2y$10$X5z8hT6pQ2sV3rN9w..."
Imposible recuperar la contraseña original desde el hash
¿Puedo tener múltiples guardias?
SÍ, por ejemplo:
web(navegador),api(tokens),admin(panel admin)
📝 Resumen Visual
[Usuario] → [Formulario Login] → [Auth::attempt()]
↓
[Verifica en BD]
↓
[Crea sesión/cookie]
↓
[Middleware auth permite]
↓
[Auth::user()->tareas() → datos personales]En esencia:
Antes: Todos ven todas las tareas (inseguro)
Después: Cada usuario ve SOLO sus tareas (seguro y privado)
¡La autenticación convierte tu aplicación de "todos ven todo" a "cada usuario ve solo lo suyo"!
- Obtener vínculo
- X
- Correo electrónico
- Otras apps
Comentarios
Publicar un comentario