Laravel 8 implementar Middleware

Imagen de Innova Labs en Pixabay

Laravel 8 implementar Middleware

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

Laravel 8 implementar Middleware

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);

Laravel 8 implementar Middleware

Abre el archivo app/Models/User.php y en la propiedad $fillable agrega ‘admin’:

Laravel 8 implementar Middleware

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);

Llama el archivo UserSeed.php

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);

Agregar lógica al MiddlewarePara 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,

Se agrega el Middleware al archivo Kernel.php

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
Ahora es necesario hacer unas modificaciones al archivo resources/views/layouts/app.blade.php primero vas a agregar al menú un item para que nos lleve a la ruta protegida por el Middleware:
<li class="nav-item">
   <a class="nav-link" href="{{ route('admin.index') }}">Acceder a Admin</a>
</li>
Laravel 8 implementar Middleware
Para mostrar un mensaje al usuario que no tiene acceso a la ruta agrega el siguiente código después de la etiqueta ‘main’:
  {{-- Alertas y mensajes --}}
  @if (session('message'))
  <div class="alert alert-{{ session('message')[0] }} text-center" role="alert">
      <b> {{ session('message')[1] }} </b>
  </div>

  @endif
Agregar codigo para mostrar mensajes

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:

Accede al sistema con tus credenciales

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:

Mensaje del Middleware

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:

Laravel 8 implementar Middleware

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

About The Author

Laravel 8 implementar Middleware comentarios en «2»

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *