Dieser Artikel vermittelt Ihnen relevantes Wissen über Laravel und Throttle-Middleware. Der Hauptinhalt besteht darin, Ihnen die Verwendung der Throttle-Middleware in Laravel8 beizubringen.
Throttle Middleware Einführung
Frequenzbegrenzungen werden häufig in APIs verwendet, um die Häufigkeit von Anfragen für bestimmte APIs durch unabhängige Anforderer zu begrenzen. Jede API wählt ihre eigene Frequenzbegrenzungszeitspanne, GitHub wählt 1 Stunde und die Laravel-Middleware wählt 1 Minute.
Zum Beispiel: Throttle:60,1, das heißt, stellen Sie die Frequenzgrenze auf 60 Mal pro Minute ein. Wenn eine IP diese Grenze innerhalb einer Minute überschreitet, gibt der Server eine 429 Too Many Attempts-Antwort zurück. [Empfohlenes Lernen: Laravel-Video-Tutorial]
Drossel-Middleware in Laravel8 verwenden
Wir verwenden hier normalerweise Drossel-Middleware, um die Rate einer bestimmten Bedingung zu begrenzen, z. B. nicht in der IP-Whitelist. IP begrenzt die Anzahl der Zugriffszeiten pro Minute. Im Vergleich zu früher verfügt die Drossel-Middleware in Laravel8 über eine einfachere Verwendungsmethode.
Zuallererst können wir sehen, dass es eine solche Definition in der Datei Kernel.php gibt
/** * The application's route middleware groups. * * @var array<string, array<int, class-string|string>> */ protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], 'api' => [ // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ]; /** * The application's route middleware. * * These middleware may be assigned to groups or used individually. * * @var array<string, class-string|string> */ protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::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, ];
Es ist offensichtlich, dass die in laravel8 => IlluminateRoutingMiddlewareThrottleRequests::class definierte „Drossel“ bereits vom Framework definiert ist und ist In der API wird Throttle:api verwendet.
Natürlich kann die allgemeine Verwendung darin bestehen, Throttle:API hier auszukommentieren, eine neue Throttle-Middleware zu erstellen oder Throttle:60,1 direkt im Routing zu verwenden.
Was ist, wenn ich komplexe Entscheidungen treffen muss, wenn ich beispielsweise viele IP-Whitelists habe, die ich ohne Ratenbegrenzung ausschließen möchte, oder wenn es einen VVVIP-Benutzer gibt, der die Rate nicht begrenzt?
Zu diesem Zeitpunkt finden wir die Datei AppProvidersRouteServiceProvider.php in laravel8. Am Ende der Datei können wir diesen Schriftzug sehen:
/** * Configure the rate limiters for the application. * * @return void */ protected function configureRateLimiting() { RateLimiter::for('api', function (Request $request) { return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip()); }); }
Die hier definierte API ist die in der obigen Datei Kernel.php verwendete API. Hier können wir benutzerdefinierte Ratenbegrenzungsbedingungen festlegen, zum Beispiel den Zugriff auf IPs außerhalb der Benutzer-IP-Whitelist auf 60 Mal pro Stunde beschränken, und die Whitelist kann jedes Mal 1.000 Mal zugreifen
RateLimiter::for('apiHour', function (Request $request) { if(!in_array($request->ip(), config('ip.whitelist'))){ return Limit::perHour(60)->by($request->ip()); }else{ return Limit::perHour(1000)->by($request->ip()); } });
Vergessen Sie natürlich nicht, es hinzuzufügen in der Konfigurationsdatei Erstellen Sie eine neue ip.php-Datei im Ordner
return [ 'whitelist' => [ '192.168.0.1', ], ];
:heart: Warme Erinnerung: Wenn Sie es verwenden, wenn Sie API-Schnittstellen-Routing verwenden, wenn Sie eine benutzerdefinierte Drosselung:apiHour verwenden möchten, vergessen Sie nicht, dies zu tun Ändern Sie die Throttle:api in der ursprünglichen Kernel.php. Kommentieren Sie es!
Endlich können wir die benutzerdefinierte Rate-Control-Middleware beim Routing problemlos verwenden
Route::group([ 'middleware' => ['throttle:apiHour'] ], function ($router) { Route::get('user', function (Request $request) { return $request->user(); }); });
Das Obige ist meine Zusammenfassung der Probleme bei der Verwendung des benutzerdefinierten Throttle-Ratings in Laravel8. Sie können diese jederzeit beheben alle. Studenten schauen zu!
Dieser Artikel ist nachgedruckt, Originaladresse: https://learnku.com/articles/73728
Das obige ist der detaillierte Inhalt vonEin Artikel, der ausführlich erklärt, wie man Throttle-Middleware in Laravel8 verwendet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!