簡體   English   中英

Laravel 覆蓋組中間件

[英]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規則最終將覆蓋任何定義其他內容的規則。

你有幾個選擇:

  1. 從內核api中間件定義中刪除節流規則,然后使用Route::group()將該特定規則重新添加到其余路由中。 然后,在同一個文件中,您可以創建一個新的Route::group()來定義自定義油門配置。

     Route::group(['middleware' => 'throttle:120,1'], function () { ... }); Route::group(['middleware' => 'throttle:15,3'], function () { ... });
  2. 創建一個自定義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,發現以下解決方案有效:

  1. kernel.php設置默認中間件
'api' => [
        'throttle:40,1',
        'bindings',
    ],
  1. 從特定路由中刪除中間件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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM