10.2-Explicación Completa de la Autenticación en Laravel

 

Explicación Completa de la Autenticación en Laravel

Voy a explicarte qué es la autenticacióncó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

text
usuarios (tabla en BD)
    ├── id
    ├── name
    ├── email
    ├── password (encriptado)
    └── remember_token

sesión (almacenada en cookies/BD/cache)
    ├── user_id
    ├── identificador único
    └── fecha expiración

2. Flujo de Autenticación

text
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

bash
composer require laravel/ui
php artisan ui bootstrap --auth

Esto genera automáticamente:

text
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 rutas

PASO 2: La Migración de Usuarios

database/migrations/2014_10_12_000000_create_users_table.php:

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:

  • password se almacena encriptado (hash bcrypt)

  • email_verified_at permite verificación por email

  • remember_token para sesiones persistentes

PASO 3: El Modelo User

app/Models/User.php:

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:

php
// 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 acceso

PASO 5: Relación Usuario-Tareas

La clave de la personalización:

php
// 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:

php
public function user()
{
    // "Esta tarea pertenece a un usuario"
    return $this->belongsTo(User::class);
}

En el modelo User:

php
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:

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 null

  • Podemos acceder a sus propiedades: Auth::user()->nameAuth::user()->email, etc.

PASO 7: Protección de Acceso Individual

Asegurando que cada usuario solo vea SUS tareas:

php
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:

html
<!-- 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

php
// 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:

  1. 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!
    ]);
  2. Protección CSRF (tokens en formularios)

    html
    @csrf <!-- Genera token único para cada formulario -->
  3. Protección XSS (Blade escapa automáticamente)

    php
    {{ $variable }} <!-- Seguro - escapa HTML -->
    {!! $variable !!} <!-- Peligroso - no escapa (solo si confías) -->
  4. 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

text
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

  1. Privacidad: Cada usuario solo ve sus propias tareas

  2. Seguridad: Nadie puede acceder a datos ajenos

  3. Personalización: Puedes agregar "Mi Perfil", "Mis Estadísticas", etc.

  4. Escalabilidad: Fácil agregar roles (admin, usuario normal) después

🔧 Posibles Mejoras Futuras

php
// 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_token en la tabla users

  • Almacena cookie por 5 años (configurable)

  • Permite sesiones persistentes

¿Es seguro almacenar passwords en la BD?

  • , 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?

  • , por ejemplo: web (navegador), api (tokens), admin (panel admin)

📝 Resumen Visual

text
[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"!

Comentarios

Entradas más populares de este blog

0-Sistema de Tareas

13-CRUD en Laravel para Web y API con Rutas Normales (No Resource)

10-Introducción a Blade en Laravel con un Ejemplo Práctico