有没有办法在Laravel的每条/个别路线上禁用速率限制?
我正在尝试测试接收大量请求的端点,但随机Laravel将开始使用{ status: 429, responseText: 'Too Many Attempts.' }
响应几百个请求,这会让测试变得非常痛苦。
答案 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 () {
//
});
});
答案 5 :(得分:3)
您实际上可以在测试中仅禁用 某些中间件。
use Illuminate\Routing\Middleware\ThrottleRequests;
class YourTest extends TestCase
{
protected function setUp()
{
parent::setUp();
$this->withoutMiddleware(
ThrottleRequests::class
);
}
...
}
答案 6 :(得分:2)
在单元测试中增加节流阀以避免可怕的429的非hacky方法:
$requestsPerMinute = ENV("REQUESTS_PER_MINUTE", 60);
Route::middleware(["auth:api", "throttle:$requestsPerMinute,1"])->group(function(){
// your routes
});
<server name="REQUESTS_PER_MINUTE" value="500"/>
答案 7 :(得分:1)
您可以在app/Http/Kernel.php
'api' => [
'throttle:120,1',
'bindings',
\App\Library\Cobalt\Http\Middleware\LogMiddleware::class,
],
如果问题仍然存在,请尝试工匠命令php artisan cache:clear