一文详解laravel8如何使用throttle中间件

本篇文章给大家laravel和throttle中间件的相关知识,主要内容是教大家怎么在 laravel8 中去使用 throttle 中间件的,下面一起来看看吧,希望对大家有所帮助!

laravle8 访问限制 throttle 中间件

throttle 中间件介绍

频率限制经常用在 API 中,用于限制独立请求者对特定 API 的请求频率。每个 API 都会选择一个自己的频率限制时间跨度,GitHub 选择的是 1 小时,Laravel 中间件选择的是 1 分钟。

例如:throttle:60,1,即设置频率限制为每分钟 60 次,如果一个 IP 一分钟内超过这个限制,那么服务器就会返回 429 Too Many Attempts. 响应。【推荐学习:laravel视频教程

在 laravel8 中使用 throttle 中间件

我们通常在这里一般会使用 throttle 中间件来做一个限定条件的速率限定,比如说不在 IP 白名单中的 IP 限制一分钟访问多少次。相对于之前来说,laravel8 中的 throttle 中间件,有了更简单的使用方法。

首先我们可以看到在 Kernel.php 文件中有这样的定义

    /**      * The application's route middleware groups.      *      * @var array<string>&gt;      */     protected $middlewareGroups = [         'web' =&gt; [             AppHttpMiddlewareEncryptCookies::class,             IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,             IlluminateSessionMiddlewareStartSession::class,             // IlluminateSessionMiddlewareAuthenticateSession::class,             IlluminateViewMiddlewareShareErrorsFromSession::class,             AppHttpMiddlewareVerifyCsrfToken::class,             IlluminateRoutingMiddlewareSubstituteBindings::class,         ],         'api' =&gt; [             // LaravelSanctumHttpMiddlewareEnsureFrontendRequestsAreStateful::class,             'throttle:api',             IlluminateRoutingMiddlewareSubstituteBindings::class,         ],     ];     /**      * The application's route middleware.      *      * These middleware may be assigned to groups or used individually.      *      * @var array<string>      */     protected $routeMiddleware = [         'auth' =&gt; AppHttpMiddlewareAuthenticate::class,         'auth.basic' =&gt; IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,         'cache.headers' =&gt; IlluminateHttpMiddlewareSetCacheHeaders::class,         'can' =&gt; IlluminateAuthMiddlewareAuthorize::class,         'guest' =&gt; AppHttpMiddlewareRedirectIfAuthenticated::class,         'password.confirm' =&gt; IlluminateAuthMiddlewareRequirePassword::class,         'signed' =&gt; IlluminateRoutingMiddlewareValidateSignature::class,         'throttle' =&gt; IlluminateRoutingMiddlewareThrottleRequests::class,         'verified' =&gt; IlluminateAuthMiddlewareEnsureEmailIsVerified::class,     ];</string></string>

很明显看到其实 laravel8 中定义的’throttle’ => IlluminateRoutingMiddlewareThrottleRequests::class, 是框架已经定义好的,并且在 api 中使用的是 throttle:api。

当然,一般的大家的用法可能就是在这里把 throttle:api 注释掉,新建一个 throttle 中间件或者是在路由中可以直接使用 throttle:60,1 这样的。

那如果是需要做一些复杂的判断,比如说我有很多个 IP 白名单想要排除掉,不做速率限制,或者是有个 VVVIP 用户不限制速率的时候怎么办呢?

这时,我们可以在 laravel8 中找到 AppProvidersRouteServiceProvider.php 文件,在文件最下面我们可以看到这样的写法

  /**      * Configure the rate limiters for the application.      *      * @return void      */     protected function configureRateLimiting()     {         RateLimiter::for('api', function (Request $request) {             return Limit::perMinute(60)-&gt;by(optional($request-&gt;user())-&gt;id ?: $request-&gt;ip());         });     }

这里定义的 api 就是上面在 Kernel.php 文件中所使用的的 throttle:api。在这里,我们可以设定自定义的速率限制条件,比如说限制用户 IP 白名单之外的 IP 访问限制为每小时 60 次,白名单每次可以访问 1000 次

RateLimiter::for('apiHour', function (Request $request) {             if(!in_array($request-&gt;ip(), config('ip.whitelist'))){                 return Limit::perHour(60)-&gt;by($request-&gt;ip());             }else{                 return Limit::perHour(1000)-&gt;by($request-&gt;ip());             }         });

当然别忘记在 config 文件夹中新建 ip.php 文件

return [     'whitelist' =&gt; [         '192.168.0.1',     ], ];

:heart:温馨提示:在使用的时候,用的是 api 接口路由的话,如果想使用自定义的 throttle:apiHour 不要忘记把原来 Kernel.php 中的 throttle:api 注释掉哟!

最后我们就可以在路由中快乐的使用自定义的速率控制中间件了

Route::group([     'middleware' =&gt; ['throttle:apiHour'] ], function ($router) {    Route::get('user', function (Request $request) {        return $request-&gt;user();    }); });

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享