¿Qué es un Middleware en Laravel 8?
Para explicar mejor qué es y cómo implementar un Middleware en Laravel 8 te pondré una analogía:
Analogía del guardia de seguridad
Tienes un gran evento y solo has enviado invitaciones para las personas más importantes para ti y a sus familias, sabes que es muy alta la probabilidad de que personas no invitadas a tu evento se cuelen o ingresen sin permiso, por lo que para evitar eso pones un guardia de seguridad en la puerta de la entrada del evento, dicho guardia solo dejará pasar a tu evento a las personas que cuenten con tu invitación y las que no tienen invitación no podrán pasar.
Entonces qué es un Middleware en Laravel 8
Así como en la anterior analogía un Middleware en Laravel 8 es un trozo de código que lo pones a cuidar el acceso de una ruta específica, en la lógica se determina bajo que condiciones un usuario puede acceder a esta ruta, sino cumple con estás condiciones el Middleware no permitirá el acceso al usuario.
Implementar un Middleware en Laravel 8
Para este tutorial crearé un proyecto en Laravel 8 desde cero, una ruta en específico será protegida por un Middleware y solo los administradores podrán acceder a dicha ruta. Manos a la obra.
Requisitos previos
- Composer instalado en el sistema operativo
- Tener instalado un entorno de desarrollo como Laragon o Xamp
1. Crear proyecto nuevo en Laravel 8
Desde la terminal de comandos escribe en la carpeta raíz de tu entorno de desarrollo:
composer create-project laravel/laravel middleware
En la terminal ingresa a la nueva carpeta de tu proyecto.
2. Instalar laravel/ui
composer require laravel/ui php artisan ui bootstrap php artisan ui bootstrap --auth npm install npm run dev npm run dev
El comando «npm run dev» en ocasiones pide correrse dos veces.
3. Crear una nueva base de datos
Es necesario crear una nueva base de datos para tu aplicación, escribe en la terminal el siguiente comando:
mysql -u root -p
Accede con tu password, sino tienes password solo da a la tecla Enter para continuar y agrega el siguiente código para crear la base de datos:
CREATE DATABASE middleware CHARACTER SET utf8 COLLATE utf8_spanish_ci;
Para salir de la consola de mysql escribe «exit» y Enter.
Abre la carpeta del proyecto con tu editor de textos favorito y en el archivo .env actualiza el nombre de la base de datos que acabas de crear:
4. Modificar tabla y modelo users
Para este proyecto es necesario que agregues el campo «admin» a la tabla users:
$table->boolean('admin')->default(false);
Abre el archivo app/Models/User.php y en la propiedad $fillable agrega ‘admin’:
5. Sembrar usuarios en la base de datos
Vas a crear un Seed para sembrar solo dos usuarios a la base de datos, uno será admin y el otro no, desde la terminal escribe:
php artisan make:seeder UserSeed
Abre el archivo database/seeders/UserSeed.php y agrega el siguiente código:
<?php namespace Database\Seeders; use Carbon\Carbon; use Illuminate\Database\Seeder; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; class UserSeed extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { DB::table('users')->insert([ 'name' => 'Alfredo Morales', 'email' => '[email protected]', 'email_verified_at' => Carbon::now(), 'password' => Hash::make('123456'), 'admin' => true, 'created_at' => Carbon::now(), 'updated_at'=> Carbon::now(), ]); DB::table('users')->insert([ 'name' => 'Usuario de Prueba', 'email' => '[email protected]', 'email_verified_at' => Carbon::now(), 'password' => Hash::make('123456'), 'admin' => false, 'created_at' => Carbon::now(), 'updated_at'=> Carbon::now(), ]); } }
Abre el archivo database/seeders/DatabaseSeeder.php agrega la siguiente línea de código para llamar al Seed cuando corran las migraciones:
$this->call(UserSeed::class);
Desde la terminal corre las migraciones y seed con el comando:
php artisan migrate --seed
Si no es la primera vez que corres las migraciones entonces agrega ‘fresh’ al comando:
php artisan migrate:fresh --seed
6. Generar Middleware desde terminal y configurarlo
Para crear e implementar un Middleware en Laravel 8 tienes que escribir en la terminal de comandos la siguiente instrucción:
php artisan make:middleware ControlAccesoMiddleware
Con tu editor preferido abre el archivo del recién creado Middleware en App\Http\Middleware\ControlAccesoMiddleware. Al método handle agrega el siguiente código que es la lógica para el acceso a la ruta que aun no hemos creado:
$blockAccess = true; if(auth()->user()->admin === 1)$blockAccess = false; if($blockAccess){ return back()->with('message', ['danger', 'No eres Admin no tienes privilegios para acceder']); } return $next($request);
Para que tu Middleware funcione es necesario un paso más, abre el archivo que esta en app/Http/Kernel.php busca el array asociativo $routeMiddleware y agrega la siguiente línea de código:
'canAccess' => \App\Http\Middleware\ControlAccesoMiddleware::class,
7. Crear ruta protegida por Middleware y vista
Abre el archivo routes/web.php para crear la ruta solo pega en el archivo el siguiente trozo de código:
Route::get('/admin', function() { return view('admin'); })->name('admin.index')->middleware('canAccess');
Crea el archivo resources/views/admin.blade.php y agrega el siguiente código:
@extends('layouts.app') @section('content') <div class="container"> <div class="row justify-content-center"> <h1>Estas en Admin</h1> </div> </div> @endsection
<li class="nav-item"> <a class="nav-link" href="{{ route('admin.index') }}">Acceder a Admin</a> </li>
{{-- Alertas y mensajes --}} @if (session('message')) <div class="alert alert-{{ session('message')[0] }} text-center" role="alert"> <b> {{ session('message')[1] }} </b> </div> @endif
8. Probar el funcionamiento del Middleware
Desde la terminal de comandos enciende el servidor incorporado de Laravel 8 y en el navegador ve a la dirección http://127.0.0.1:8000 e ingresa al sistema (recuerda que dimos de alta dos usuarios) te mostrará la siguiente pantalla:
Como ves yo he accedido al sistema con el usuario de prueba que no es Admin, si trato de entrar a la ruta ‘Acceder a Admin’ el sistema me mostrará el siguiente mensaje:
El Middleware me ha negado el paso a la ruta porque no soy Admin. Ahora si accedo con mi usuario y trato de acceder a dicha ruta me muestra el siguiente mensaje:
Ahora me permitió entrar como Admin.
Conclusión
En este tutorial te he mostrado cómo implementar un Middleware en Laravel 8, ahora puedes llevarlo a tus proyectos para hacer tus rutas más seguras. Si este tutorial te ayudó te invito a compartirlo en tus redes sociales para llegar a más personas, sí tienes dudas o comentarios déjalos abajo en la caja de comentarios, estaré al pendiente de ellos. Te mando un cordial saludo.
Repositorio: https://github.com/diarioprogramador/middleware-laravel8
Referencia: Laravel 8 documentación
Este tutorial me fue de mucha ayuda, gracias por compartir, saludos!
Hola Py, gracias por visitar y comentar, me alegra que este tutorial fue de ayuda, saludos!