[英]Laravel override group middleware
如何覆蓋組中間件? 我想要實現的是為注冊/登錄路由添加其他節流限制。
我當前的油門是在內核中設置的。
'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
所以據我所知,我的新中間件沒有被應用。 但是我的油門請求被計算了兩次。 我如何應用不同的中間件來限制登錄/注冊路由並覆蓋舊的?
有同樣的問題,只是做了一些研究。 似乎沒有辦法覆蓋中間件配置。
我也看到我的中間件已經在route:list
更新,但是在解析中間件時,它總是使用一組合並的規則,因此初始api
規則最終將覆蓋任何定義其他內容的規則。
你有幾個選擇:
從內核api
中間件定義中刪除節流規則,然后使用Route::group()
將該特定規則重新添加到其余路由中。 然后,在同一個文件中,您可以創建一個新的Route::group()
來定義自定義油門配置。
Route::group(['middleware' => 'throttle:120,1'], function () { ... }); Route::group(['middleware' => 'throttle:15,3'], function () { ... });
創建一個自定義api-auth.php
文件,該文件包含在您定義的自定義中間件組中,就像默認的api
中間件一樣。 (您需要在RouteServiceProvider
添加另一個調用來加載它,如下所示:
public function map() { ... $this->mapCustomAuthRoutes(); } protected function mapCustomAuthRoutes() { Route::middleware(['throttle:15,3', 'bindings']) ->namespace($this->namespace) ->as('api.') ->group(base_path('routes/api-auth.php')); }
老話題,但這是我發現的第一個話題; 是時候更新答案了。
我過去也遇到過這個問題。 我當時的解決方案是在控制器的構造函數中添加中間件。 我不喜歡它,但它有效。
我目前正在一個新項目中使用 Laravel 8,發現以下解決方案有效:
kernel.php
設置默認中間件'api' => [
'throttle:40,1',
'bindings',
],
throttle:40,1
,並添加正確的中間件throttle:15,3
:Route::post('login', 'Api\UserController@login')->withoutMiddleware('throttle:40,1')->middleware('throttle:15,3')->name('user.login');
如果您不刪除中間件,它將為每個請求運行兩次節流中間件。
我還在Api\\UserController
的構造函數中使用了$this->middleware( 'throttle:40,1' )->except( ['login'] )
,但是沒有給出所需的結果; 它只會為除一種方法之外的所有方法添加中間件,它不會覆蓋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.