在Laravel中禁用速率限制器?

时间:2017-03-27 23:40:06

标签: php laravel

有没有办法在Laravel的每条/个别路线上禁用速率限制?

我正在尝试测试接收大量请求的端点,但随机Laravel将开始使用{ status: 429, responseText: 'Too Many Attempts.' }响应几百个请求,这会让测试变得非常痛苦。

8 个答案:

答案 0 :(得分:64)

app/Http/Kernel.php中,Laravel对所有api路由都有默认的限制。

protected $middlewareGroups = [
    ...
    'api' => [
        'throttle:60,1',
    ],
];

评论或增加它。

答案 1 :(得分:13)

假设您正在使用API​​路由,那么您可以在app / Http / Kernel.php中更改限制或完全取消。如果你需要限制其他路由,你可以单独为它们注册中间件。

(以下示例:节流 - 60次尝试然后锁定1分钟)

'api' => [
        'throttle:60,1',
        'bindings',
    ],

答案 2 :(得分:6)

如果您只想禁用自动化测试,可以在测试中使用WithoutMiddleware特征。

use Illuminate\Foundation\Testing\WithoutMiddleware;

class YourTest extends TestCase {
    use WithoutMiddleware;

    ...

否则,只需从内核文件('throttle:60,1',)中删除app/Http/Kernel.php行,您的问题就会得到解决。

答案 3 :(得分:5)

您可以使用cache:clear命令清除包括速率限制在内的缓存,如下所示:

php artisan cache:clear

答案 4 :(得分:4)

在Laravel 5.7中

动态速率限制 您可以基于已认证的用户模型的属性指定最大动态请求数。例如,如果您的用户模型包含rate_limit属性,则可以将该属性的名称传递给节流中间件,以便用于计算最大请求数:

Route::middleware('auth:api', 'throttle:rate_limit,1')->group(function () {
    Route::get('/user', function () {
        //
    });
});

https://laravel.com/docs/5.7/routing#rate-limiting

答案 5 :(得分:3)

您实际上可以在测试中仅禁用 某些中间件。

use Illuminate\Routing\Middleware\ThrottleRequests;

class YourTest extends TestCase 
{

    protected function setUp()
    {
        parent::setUp();
        $this->withoutMiddleware(
            ThrottleRequests::class
        );
    }
    ...
}

答案 6 :(得分:2)

在单元测试中增加节流阀以避免可怕的429的非hacky方法:

  1. 从内核文件中间件中删除节流阀:60,1。
  2. 改为使用环境变量将油门中间件重新添加到路线组中:
$requestsPerMinute = ENV("REQUESTS_PER_MINUTE", 60);
Route::middleware(["auth:api", "throttle:$requestsPerMinute,1"])->group(function(){
  // your routes
});
  1. 在phpunit.xml中将REQUESTS_PER_MINUTE环境变量定义得更高,以便在节流之前允许在测试环境中有更多请求。
<server name="REQUESTS_PER_MINUTE" value="500"/>
  1. (也可以在.env中定义新的REQUESTS_PER_MINUTE变量,即使它回到60。)

答案 7 :(得分:1)

您可以在app/Http/Kernel.php

中添加以下行
    'api' => [
        'throttle:120,1',
        'bindings',
         \App\Library\Cobalt\Http\Middleware\LogMiddleware::class,
    ],

如果问题仍然存在,请尝试工匠命令php artisan cache:clear