在Laravel中禁用速率限制器?

Sim*_*leJ 39 php laravel

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

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

Edd*_*ove 89

app/Http/Kernel.phpLaravel中,所有api路由都有默认的限制.

protected $middlewareGroups = [
    ...
    'api' => [
        'throttle:60,1',
    ],
];
Run Code Online (Sandbox Code Playgroud)

评论或增加它.

  • 正确.注释掉意味着没有限制. (4认同)
  • 这不应该是公认的答案,而应该是穆斯塔法的答案。这会改变所有环境,而不仅仅是测试。在问题中,OP 明确表示他想要进行测试。 (4认同)
  • 如果我评论是否意味着它没有限制? (3认同)
  • 这种方法_强烈_不建议使用,除非您的应用程序逻辑有改变限制的特定原因。如果你想关闭测试的节流,使用:`$this->withoutMiddleware()->get($url, $data);`。 (2认同)
  • 评论它似乎并不意味着我最近的测试没有限制 (2认同)

svi*_*eet 19

如果您使用 Laravel 8.x 或更高版本,您可以通过以下步骤使用 RateLimiter:

在您的 app/Providers/RouteServiceProvider.php 中找到下面的 configureRateLimiting:

protected function configureRateLimiting()
{

    RateLimiter::for('api', function (Request $request) {
        return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip());
    });

    // no limit throttle
    RateLimiter::for('none', function (Request $request) {
        return Limit::none();
    });

}
Run Code Online (Sandbox Code Playgroud)

在您的 app/web.php 中添加 'throttle:none:

Route::group(['middleware' => ['auth', 'throttle:none']], function ($router) {
    Route::post('test', 'TestController@test');
});
Run Code Online (Sandbox Code Playgroud)


小智 15

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

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

'api' => [
        'throttle:60,1',
        'bindings',
    ],
Run Code Online (Sandbox Code Playgroud)


Pet*_*lev 12

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

php artisan cache:clear
Run Code Online (Sandbox Code Playgroud)


Mos*_*hri 7

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

use Illuminate\Routing\Middleware\ThrottleRequests;

class YourTest extends TestCase 
{

    protected function setUp()
    {
        parent::setUp();
        $this->withoutMiddleware(
            ThrottleRequests::class
        );
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案,因为这是测试此类内容的正确方法。全局禁用 Throttle 限制并不是一个好的做法。 (8认同)

Eli*_*res 6

如果要仅禁用自动测试,可以WithoutMiddleware在测试中使用特征.

use Illuminate\Foundation\Testing\WithoutMiddleware;

class YourTest extends TestCase {
    use WithoutMiddleware;

    ...
Run Code Online (Sandbox Code Playgroud)

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


120*_*DEV 6

在Laravel 5.7中

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

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

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


小智 6

就我而言,我只是更改了“App\Providers\RouteServiceProvider”中的默认值perMinute()

protected function configureRateLimiting()
    {
        RateLimiter::for('api', function (Request $request) {
            $perMinute = env('APP_ENV') === 'testing' ? 1000 : 60;

            return Limit::perMinute($perMinute)
              ->by(optional($request->user())->id ?: $request->ip());
        });
    }

Run Code Online (Sandbox Code Playgroud)

  • 如果启用缓存,`env('APP_ENV')` 将无法正常工作。文档有这个 bool 检查 `\Illuminate\Support\Facades\App::environment('testing') 吗?1000:60;` (2认同)

NIK*_*ATH 5

您可以在您的app/Http/Kernel.php

    'api' => [
        'throttle:120,1',
        'bindings',
         \App\Library\Cobalt\Http\Middleware\LogMiddleware::class,
    ],
Run Code Online (Sandbox Code Playgroud)

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