如何覆盖组中间件?我想实现的是添加其他节流限制注册/登录路由。
我当前的节流阀是在内核中设置的。
'api' => [
'throttle:40,1',
'bindings',
],
我想为登录/注册路由设置新的限制。
我就是这么做的。
Route::post('login', 'Api\UserController@login')->middleware('throttle:15,3')->name('user.login');
Route::post('register', 'Api\UserController@register')->middleware('throttle:15,3')->name('user.register');
当我运行php artisan route:list时,它说这个中间件API,throttle:15,3应用于这个路由。
问题是当我运行登录请求时,响应头显示
X-RateLimit-Limit 40
X-RateLimit-Remaining 38
因此,据我所知,我的新中间件没有应用。但我的节流请求被计算了两次。我如何在登录/注册路由上应用不同的中间件进行节流并覆盖旧的中间件?
4条答案
按热度按时间z9zf31ra1#
老主题了,但这是我第一次发现;是时候更新答案了。
我以前也有过这样的问题。我当时的解决方案是在控制器的构造函数中添加中间件。我不喜欢它,但它工作。
我目前在一个新项目中使用Laravel 8,发现以下解决方案有效:
1.在
kernel.php
中设置默认中间件1.从特定路由中删除中间件
throttle:40,1
,并添加正确的中间件throttle:15,3
:如果您不删除中间件,它将在每个请求中运行两次节流中间件。
我还在
Api\UserController
的构造函数中尝试了$this->middleware( 'throttle:40,1' )->except( ['login'] )
,但是这并没有给予所需的结果;它只会为所有方法添加中间件,但不会覆盖。i5desfxk2#
我也有同样的问题,只是做了一些研究。似乎没有覆盖中间件配置的方法。
我也看到我的中间件在
route:list
中更新了,但是在解析中间件时,它总是使用一组合并的规则,因此初始api
规则最终会覆盖任何定义其他东西的东西。你有几个选择:
1.从内核
api
中间件定义中删除throttle规则,然后使用Route::group()
将该特定规则重新添加到其余路由中。然后,在同一个文件中,您可以创建一个新的Route::group()
来定义自定义的throttle配置。1.创建一个自定义的
api-auth.php
文件,它被 Package 在一个自定义的中间件组中,就像默认的api
中间件一样。(您需要在RouteServiceProvider
中添加另一个调用来加载它,如下所示:xxslljrj3#
据我所知,覆盖组中间件的唯一方法是禁用它,然后启用另一个:
如果有更好的办法告诉我。我想把这里收拾一下。
lpwwtiir4#
从全局组中删除Throttle Middleware:在app/Http/Kernel.php文件中,从全局API组中删除Throttle Middleware。默认情况下,全局组应用于所有路由。
更改此选项:
这是:
定义新的中间件组:在app/Http/Kernel.php文件中创建一个新的中间件组,专门用于API节流。您可以给予一个自定义名称,如“API. throttle”。
将自定义中间件组应用于大多数API路由:现在,将新的API.throttle中间件组应用于routes/api.php文件中的大多数API路由。这将对大多数路由应用默认限制。
在登录/注册路由上禁用中间件:对于登录和注册路由,您可以使用自定义的throttle设置覆盖API.throttle中间件。
这只是我最常用的一种想法和方法。
或者您可以像下面这样创建新呼叫。
在App\Http\Kernel.php文件中定义新的中间件组。例如,让我们称之为throttle-auth:
像下面这样应用。