php Laravel覆盖组中间件

rlcwz9us  于 2023-10-15  发布在  PHP
关注(0)|答案(4)|浏览(115)

如何覆盖组中间件?我想实现的是添加其他节流限制注册/登录路由。
我当前的节流阀是在内核中设置的。

'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

因此,据我所知,我的新中间件没有应用。但我的节流请求被计算了两次。我如何在登录/注册路由上应用不同的中间件进行节流并覆盖旧的中间件?

z9zf31ra

z9zf31ra1#

老主题了,但这是我第一次发现;是时候更新答案了。
我以前也有过这样的问题。我当时的解决方案是在控制器的构造函数中添加中间件。我不喜欢它,但它工作。
我目前在一个新项目中使用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'] ),但是这并没有给予所需的结果;它只会为所有方法添加中间件,但不会覆盖。

i5desfxk

i5desfxk2#

我也有同样的问题,只是做了一些研究。似乎没有覆盖中间件配置的方法。
我也看到我的中间件在route:list中更新了,但是在解析中间件时,它总是使用一组合并的规则,因此初始api规则最终会覆盖任何定义其他东西的东西。
你有几个选择:
1.从内核api中间件定义中删除throttle规则,然后使用Route::group()将该特定规则重新添加到其余路由中。然后,在同一个文件中,您可以创建一个新的Route::group()来定义自定义的throttle配置。

Route::group(['middleware' => 'throttle:120,1'], function () {
     ...
});

Route::group(['middleware' => 'throttle:15,3'], function () {
     ...
});

1.创建一个自定义的api-auth.php文件,它被 Package 在一个自定义的中间件组中,就像默认的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'));
}
xxslljrj

xxslljrj3#

据我所知,覆盖组中间件的唯一方法是禁用它,然后启用另一个:

Route::withoutMiddleware(ThrottleRequests::class.':api')->group(function () {
    Route::middleware(ThrottleRequests::class.':custom')->group(function () {
        ///
    });
});

如果有更好的办法告诉我。我想把这里收拾一下。

lpwwtiir

lpwwtiir4#

从全局组中删除Throttle Middleware:在app/Http/Kernel.php文件中,从全局API组中删除Throttle Middleware。默认情况下,全局组应用于所有路由。
更改此选项:

'api' => [
    'throttle:40,1',
    'bindings',
],

这是:

'api' => [
    'bindings',
],

定义新的中间件组:在app/Http/Kernel.php文件中创建一个新的中间件组,专门用于API节流。您可以给予一个自定义名称,如“API. throttle”。

'api.throttle' => [
    'throttle:40,1', // The default throttle for most API routes
],

将自定义中间件组应用于大多数API路由:现在,将新的API.throttle中间件组应用于routes/api.php文件中的大多数API路由。这将对大多数路由应用默认限制。

Route::middleware(['api.throttle'])->group(function () {
    // Define your API routes here.
});

在登录/注册路由上禁用中间件:对于登录和注册路由,您可以使用自定义的throttle设置覆盖API.throttle中间件。

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');

这只是我最常用的一种想法和方法。

或者您可以像下面这样创建新呼叫。

App\Http\Kernel.php文件中定义新的中间件组。例如,让我们称之为throttle-auth:

'throttle-auth' => 'throttle:15,3',

像下面这样应用。

Route::group(['middleware' => 'throttle-auth'], function () {
    Route::post('login', 'Api\UserController@login')->name('user.login');
    Route::post('register', 'Api\UserController@register')->name('user.register');
});

相关问题