Artikler

Laravel mellomvare hvordan det fungerer

Laravel-mellomvare er et mellomliggende applikasjonslag som griper inn mellom brukerens forespørsel og applikasjonens svar.

Dette betyr at når brukeren (Laravel-visning) sender en forespørsel til serveren (Laravel-kontrolleren), vil forespørselen gå gjennom mellomvaren. På denne måten kan mellomvaren sjekke om forespørselen er autentisert eller ikke: 

  • hvis brukerens forespørsel er autentisert, sendes forespørselen til backend;
  • hvis brukerens forespørsel er uautentisert, vil mellomvaren omdirigere brukeren til påloggingsskjermen.

Laravel lar deg defifullfør og bruk ekstra mellomvare for å utføre en rekke oppgaver bortsett fra autentisering. 

Laravel-mellomvare, som autentisering og CSRF-beskyttelse, er plassert i katalogen app/Http/Middelvare .

Vi kan derfor si at mellomvaren er et http-forespørselsfilter, der det er mulig å verifisere forhold og utføre handlinger.

Opprette mellomvare

For å lage en ny mellomvare kjører vi følgende kommando:

php artisan make:middleware <name-of-middleware>

Vi skaper middleware og vi kaller det CheckAge, artisan vil svare oss som følger:

Vinduet ovenfor viser at mellomvaren har blitt opprettet med navnet " SjekkAlder ".

For å se om CheckAge-mellomvaren er opprettet eller ikke, gå til prosjektet i app/Http/Middleware-mappen, og du vil se den nyopprettede filen

Den nyopprettede filen har følgende kode

<?php

namespace App\Http\Middleware;

use Closure;

class CheckAge
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

Bruk mellomvare

For å bruke mellomvare må vi registrere den.

Det er to typer mellomvare i Laravel:

  • Middleware globale
  • Route Middleware

Il global mellomvare vil bli utført på hver HTTP-forespørsel fra applikasjonen, mens Rute mellomvare vil bli tildelt en bestemt bane. Mellomvare kan registreres på app/Http/Kernel.php. Denne filen inneholder to egenskaper $mellomvare e $routeMiddleware . $middleware-eiendommen brukes til å registrere global mellomvare og eierskap $routeMiddleware brukes til å registrere rutespesifikk mellomvare.

For å registrere global mellomvare, oppgi klassen på slutten av egenskapen $middleware.

protected $middleware = [
        \App\Http\Middleware\TrustProxies::class,
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];

For å registrere rutespesifikk mellomvare, legg til nøkkelen og verdien til $routeMiddleware-egenskapen.

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    ];

Vi skapte SjekkAlder i forrige eksempel. Vi kan nå registrere dette i ruteegenskapen mellomvare. Koden for en slik registrering er vist nedenfor.

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'Age' => \App\Http\Middleware\CheckAge::class,
    ];

Mellomvareparametere

Vi kan også sende parametere med mellomvare. 

For eksempel, hvis applikasjonen din har forskjellige roller som bruker, admin, superadmin osv. og du ønsker å autentisere handlingen basert på rollen, kan du gjøre det ved å sende parametrene med mellomvaren. 

Mellomvaren vi opprettet inneholder følgende funksjon, og vi kan sende tilpassede argumenter etter argumentet $neste .

    public function handle($request, Closure $next)
    {
        return $next($request);
    }

La oss nå prøve å sette rolleparameteren til en ny mellomvare som vi skal lage fra bunnen av, og fortsett deretter med å lage rollemellomvare ved å kjøre følgende kommando

Endre håndtaksmetoden som følger

<?php

namespace App\Http\Middleware;
use Closure;

class RoleMiddleware {
   public function handle($request, Closure $next, $role) {
      echo "Role: ".$role;
      return $next($request);
   }
}

vi la til parameteren $role, og inne i metoden linjen echo for å skrive utgangen navnet på rollen.

Nyhetsbrev for innovasjon
Ikke gå glipp av de viktigste nyhetene om innovasjon. Registrer deg for å motta dem på e-post.

La oss nå registrere RoleMiddleware-mellomvaren for en bestemt bane

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'Age' => \App\Http\Middleware\CheckAge::class,
        'Role' => \App\Http\Middleware\RoleMiddleware::class,
    ];

Nå for å teste mellomvaren med parameteren, må vi lage en forespørsel og et svar. For å simulere responsen, la oss lage kontrolleren som vi vil kalle TestController

php artisan make:controller TestController --plain

kommandoen som nettopp ble utført vil opprette en ny kontroller inne i mappen app/Http/TestController.php, og endre metoden index med linjen echo "<br>Test Controller.";

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class TestController extends Controller {
   public function index() {
      echo "<br>Test Controller.";
   }
}

Etter å ha satt opp svaret, bygger vi forespørselen ved å redigere filen routes.phpved å legge til route role

Route::get('role',[
   'middleware' => 'Role:editor',
   'uses' => 'TestController@index',
]);

på dette tidspunktet kan vi prøve eksemplet ved å gå til URL-en http://localhost:8000/role

og i nettleseren vil vi se de to echo

Role editor
Test Controller

Avsluttbar mellomvare

Il terminable Middleware utfører noen oppgaver etter at svaret er sendt til nettleseren. Dette kan oppnås ved å lage en mellomvare med metoden avsluttes i mellomvaren. Il terminable Middleware må være registrert hos middleware global. Metoden terminate vil motta to argumenter $ forespørsel e $respons. 

Metoden Terminate må opprettes som vist i følgende kode.

php artisan make:middleware TerminateMiddleware

Når mellomvaren er opprettet app/Http/Middleware/TerminateMiddleware.php la oss endre koden som følger

<?php

namespace App\Http\Middleware;
use Closure;

class TerminateMiddleware {
   public function handle($request, Closure $next) {
      echo "Executing statements of handle method of TerminateMiddleware.";
      return $next($request);
   }
   
   public function terminate($request, $response) {
      echo "<br>Executing statements of terminate method of TerminateMiddleware.";
   }
}

i dette tilfellet har vi en metode handle og en metode terminate med de to parameterne $request e $response.

La oss nå registrere mellomvaren

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'Age' => \App\Http\Middleware\CheckAge::class,
        'Role' => \App\Http\Middleware\RoleMiddleware::class,
        'terminate' => \App\Http\Middleware\TerminateMiddleware::class,
    ];

Nå må vi lage kontrolleren for å simulere responsen

php artisan make:controller XYZController --plain

endre innholdet i klassen

class XYZController extends Controller {
   public function index() {
      echo "<br>XYZ Controller.";
   }
}

Nå må vi redigere filen routes/web.php legge til rutene som trengs for å aktivere forespørselen

Route::get('terminate',[
   'middleware' => 'terminate',
   'uses' => 'XYZController@index',
]);

på dette tidspunktet kan vi prøve eksemplet ved å gå til URL-en http://localhost:8000/terminate

og i nettleseren vil vi se følgende linjer

Executing statements of handle method of TerminateMiddleware
XYZController
Executing statements of terminate method of TerminateMiddleware

Ercole Palmeri

Du vil kanskje også like:

Nyhetsbrev for innovasjon
Ikke gå glipp av de viktigste nyhetene om innovasjon. Registrer deg for å motta dem på e-post.

Siste artikler

Veeam har den mest omfattende støtten for løsepengevare, fra beskyttelse til respons og gjenoppretting

Coveware by Veeam vil fortsette å tilby responstjenester for cyberutpressing. Coveware vil tilby kriminaltekniske og utbedringsmuligheter...

23 april 2024

Grønn og digital revolusjon: Hvordan prediktivt vedlikehold transformerer olje- og gassindustrien

Prediktivt vedlikehold revolusjonerer olje- og gasssektoren, med en innovativ og proaktiv tilnærming til anleggsledelse...

22 april 2024

Britisk antitrustregulator vekker BigTech-alarm over GenAI

UK CMA har utstedt en advarsel om Big Techs oppførsel i markedet for kunstig intelligens. Der…

18 april 2024

Casa Green: energirevolusjon for en bærekraftig fremtid i Italia

"Green Houses"-dekretet, formulert av EU for å forbedre energieffektiviteten til bygninger, har avsluttet sin lovgivningsprosess med...

18 april 2024