Laravel API 从速率限制中排除 1 个 IP 地址

Mar*_*ICU 5 php middleware throttling laravel

在 Laravel API 上,我使用默认的中间件进行节流设置了速率限制;

Route::group(['prefix' => 'products'], function() {
    Route::get('/', ['as' => 'products.index', 'uses' => 'CustomerProductController@index'])->middleware('throttle:60,1');
    Route::get('/{product}', ['as' => 'products.show', 'uses' => 'CustomerProductController@show'])->middleware('throttle:50,1');
});
Run Code Online (Sandbox Code Playgroud)

现在我需要制作自己的中间件以从限制中排除 1 个 IP 地址。但不知何故,我只能找到有关以其他方式做事的建议,例如。限制一组 IP 地址。

有人可以给我一个正确方向的推动吗?

wsc*_*ohl 11

这是我将要做什么的简短概述。

第1步

创建一个新的中间件即 ThrottleRequestsWithIp

php artisan make:middleware ThrottleRequestsWithIp
Run Code Online (Sandbox Code Playgroud)

第2步

让它扩展原来的油门中间件类\Illuminate\Routing\Middleware\ThrottleRequests

如果你想看看原始框架中间件,你可以在下面找到它 /vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php

覆盖该handle方法以检查 IP 地址,如果未找到则调用父方法。

这就是你的App\Http\Middleware\ThrottleRequestsWithIp样子

php artisan make:middleware ThrottleRequestsWithIp
Run Code Online (Sandbox Code Playgroud)

第 3 步

例如,在 Kernel.php 中注册您的新中间件

'throttleIp' => \App\Http\Middleware\ThrottleRequestsWithIp::class
Run Code Online (Sandbox Code Playgroud)

第四步

像这样在你的路线中使用它

<?php

namespace App\Http\Middleware;

use Closure;

class ThrottleRequestsWithIp extends \Illuminate\Routing\Middleware\ThrottleRequests
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next, $maxAttempts = 60, $decayMinutes = 1, $prefix = '')
    {
        if($request->ip() === "192.168.10.2") 
            return $next($request);

        return parent::handle($request, $next, $maxAttempts, $decayMinutes, $prefix);
    }
}
Run Code Online (Sandbox Code Playgroud)