在Laravel中禁用速率限制器?


76

有没有一种方法可以禁用Laravel中每条/每条路线的速率限制?

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

Answers:


140

app/Http/Kernel.phpLaravel中,所有api路径都有默认的油门限制。

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

评论或增加它。


3
如果我发表评论,那意味着没有限制吗?
ßiansor埃。Ålmerol18年

8
正确。注释掉意味着没有限制。
jezmck

1
除非您的应用程序逻辑有特定的理由来改变限制,否则强烈不建议采用这种方法。如果您想关闭限制进行测试,请使用:$this->withoutMiddleware()->get($url, $data);
Soulriser

3
评论出来似乎并不意味着对我最近的测试没有限制
Tim Ogilvy

1
一旦达到限制,是否有办法重置油门?我将系统日期更改为2个月以测试某些内容,现在“重试”响应HTTP标头指示我必须等待2个月才能访问API路由。
Mohal

26

实际上,您只能在测试中禁用某些中间件。

use Illuminate\Routing\Middleware\ThrottleRequests;

class YourTest extends TestCase 
{

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

5
这应该是公认的答案,因为这是测试类似内容的正确方法。全局禁用油门限制不是一个好习惯。
Lachezar Todorov,

需要Laravel 5.5以上版本
danronmoon

16

假设您使用的是API路由,则可以在app / Http / Kernel.php中更改油门或将其完全取消。如果您需要限制其他路线,则可以分别为其注册中间件。

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

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

9

在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


我试图在Laravel 5.4和它的工作,但由于某种原因,它是用一半我把该值。
Sodj

6

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

use Illuminate\Foundation\Testing\WithoutMiddleware;

class YourTest extends TestCase {
    use WithoutMiddleware;

    ...

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



2

一种避免在单元测试中增加油门以避免429可怕的方法:

  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)。

2

您可以在以下行中添加以下行 app/Http/Kernel.php

    'api' => [
        'throttle:120,1',
        'bindings',
         \App\Library\Cobalt\Http\Middleware\LogMiddleware::class,
    ],

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


运行为我工作的命令
斯托·瓦西列夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.