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

Laravel API exclude 1 ip address from rate limiting

在 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');
});

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

有人能给我一个正确的方向吗?

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

步骤 1

创建一个新的中间件,即 ThrottleRequestsWithIp

php artisan make:middleware ThrottleRequestsWithIp

步骤 2

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

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

下找到它

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

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

<?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);
    }
}

步骤 3

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

'throttleIp' => \App\Http\Middleware\ThrottleRequestsWithIp::class

步骤 4

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

Route::get('/', [
    'as' => 'products.index', 
    'uses' => 'CustomerProductController@index'
])->middleware('throttleIp:60,1');