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

Fremtiden er her: Hvordan shippingindustrien revolusjonerer den globale økonomien

Marinesektoren er en ekte global økonomisk makt, som har navigert mot et 150 milliarder marked...

1 mai 2024

Utgivere og OpenAI signerer avtaler for å regulere flyten av informasjon som behandles av kunstig intelligens

Sist mandag kunngjorde Financial Times en avtale med OpenAI. FT lisensierer sin journalistikk i verdensklasse...

30 april 2024

Nettbetalinger: Her er hvordan strømmetjenester får deg til å betale for alltid

Millioner av mennesker betaler for strømmetjenester og betaler månedlige abonnementsavgifter. Det er vanlig oppfatning at du...

29 april 2024

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