Documentación: App Laravel con Login, Registro y Protección de Rutas

Esta documentación resume los pasos clave y conceptos importantes para crear una aplicación Laravel sencilla como la desarrollada:


1. Estructura base del proyecto

DocumentRoot /var/www/miapplaravel/public

<Directory /var/www/miapplaravel/public>
    AllowOverride All
    Require all granted
</Directory>

2. Rutas (routes/web.php)

Separación clara entre:

use App\Http\Controllers\PageController;
use App\Http\Controllers\AuthController;
use Illuminate\Support\Facades\Route;

// Públicas
Route::get('/', [PageController::class, 'index'])->name('home');
Route::get('/login', [AuthController::class, 'showLogin'])->name('login');
Route::post('/login', [AuthController::class, 'login']);
Route::get('/registro', [AuthController::class, 'showRegistro'])->name('registro');
Route::post('/registro', [AuthController::class, 'registro']);

// Logout (POST obligatorio)
Route::post('/logout', [AuthController::class, 'logout'])->name('logout');

// Protegidas
Route::get('/proyectos', [PageController::class, 'proyectos'])->name('proyectos')->middleware('auth');
Route::get('/proyecto', [PageController::class, 'proyecto'])->name('proyecto')->middleware('auth');

3. Migración de usuarios

Tabla personalizada usuarios.

Schema::create('usuarios', function (Blueprint $table) {
    $table->id();
    $table->string('username')->unique();
    $table->string('description');
    $table->string('email')->unique();
    $table->string('password');
    $table->timestamps();
});

Ejecutar solo esta migración en el servidor:

php artisan migrate --path=database/migrations/xxxx_xx_xx_create_usuarios_table.php

4. Modelo Usuario

Archivo: app/Models/Usuario.php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;

class Usuario extends Authenticatable
{
    protected $table = 'usuarios';

    protected $fillable = [
        'username',
        'description',
        'email',
        'password'
    ];

    protected $hidden = [
        'password',
    ];
}

5.Configurar Auth para usar usuarios

Archivo: config/auth.php

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Models\Usuario::class,
    ],
],

6. Controlador de autenticación

Archivo: app/Http/Controllers/AuthController.php

Login
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;

public function login(Request $request)
{
    $credentials = $request->validate([
        'email' => 'required|email',
        'password' => 'required',
    ]);

    if (Auth::attempt($credentials)) {
        $request->session()->regenerate();
        return redirect()->route('proyectos');
    }

    return back()->withErrors([
        'email' => 'Credenciales incorrectas',
    ]);
}

6.1. Registro

use App\Models\Usuario;
use Illuminate\Support\Facades\Hash;

public function registro(Request $request)
{
    $data = $request->validate([
        'username' => 'required|unique:usuarios',
        'description' => 'required',
        'email' => 'required|email|unique:usuarios',
        'password' => 'required|min:6',
    ]);

    Usuario::create([
        'username' => $data['username'],
        'description' => $data['description'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
    ]);

    return redirect()->route('login');
}

6.2. Logout (POST)

use Illuminate\Support\Facades\Auth;

public function logout(Request $request)
{
    Auth::logout();
    $request->session()->invalidate();
    $request->session()->regenerateToken();

    return redirect()->route('login');
}

7. Formularios en Blade

Login (login.blade.php)

<form method="POST" action="{{ route('login') }}">
    @csrf
    <input type="email" name="email" required>
    <input type="password" name="password" required>
    <button type="submit">Entrar</button>
</form>

Logout (IMPORTANTE: POST)

<form method="POST" action="{{ route('logout') }}">
    @csrf
    <button type="submit">
        <i class="fa-solid fa-arrow-right-from-bracket"></i>
    </button>
</form>

8. Acceder al usuario autenticado

En el controlador

use Illuminate\Support\Facades\Auth;

public function proyectos()
    {
        $usuario = auth()->user();
        return view('proyectos',['usuario'=>$usuario]); // muestra proyectos.blade.php
    }

En la vista (proyectos.blade.php)

<h1>Bienvenido, {{ $usuario->description }}</h1>

9. Protección de rutas

Laravel redirige automáticamente a /login si:

La ruta tiene middleware auth

No hay sesión iniciada

Route::get('/proyectos', [PageController::class, 'proyectos'])->name('proyectos')->middleware('auth');
Route::get('/proyecto', [PageController::class, 'proyecto'])->name('proyecto')->middleware('auth');

10. Vite y CSS

CSS fuente → resources/css/app.css

Se compila a public/build

En vistas:

@vite('resources/css/app.css')

Comandos:

npm install
npm run build

11. Limpieza de cache (muy importante)

php artisan view:clear
php artisan route:clear
php artisan config:clear
php artisan cache:clear

Flujo final de la app

  1. Usuario entra en /login\
  2. Envía formulario (POST)\
  3. Laravel valida credenciales\
  4. Se crea sesión\
  5. Redirección a /proyectos\
  6. Rutas protegidas por auth\
  7. Datos del usuario disponibles en vistas\
  8. Logout mediante POST invalida sesión