Laravel8Fortify登录显示429TOOMANYREQUESTS
我遇到了与 429 TOO MANY REQUESTS 相关的问题。我使用过 Laravel fortify,我的网络路线就像
Route::get('/', function () {
return view('welcome');
});
Route::get('/dashboard','DashboardController@dashboardView')
->name('dashboard')->middleware('auth');
问题是间歇性出现的,成功登录后,如果我立即退出并立即尝试登录,我将重定向到仪表板,它给出了 429 TOO MANY REQUESTS 并且在地址栏中,URL 为http://127.0.0.1:8000/登录。现在,如果我在那里等待一秒钟并刷新页面,它会重定向到仪表板页面。
我在网上搜索过,每个人都在谈论油门,但我不认为这是解决方案。请帮我。谢谢。
回答
我今天偶然发现了同样的问题并进行了一些调试。在注册 /login 路由时,Fortify 会对其应用IlluminateRoutingMiddlewareThrottleRequests:login中间件。这意味着,对于对该路由的每个请求,ThrottleRequests中间件将调用该RateLimiter指定键的实例。显然,Fortify 没有RateLimiter为login密钥注册 a 。
由于实例$limiters属性中缺少键RateLimiter,ThrottleRequests中间件使用其默认回退,它不处理边缘情况“应该为该键设置速率限制器,但没有。” 真的很好。该$maxAttempts变量设置为 0,将导致不稳定的速率限制行为。
我觉得这是 Fortify 中的一个错误,因为LaravelFortifyActionsEnsureLoginIsNotThrottled在LaravelFortifyHttpControllersAuthenticatedSessionController控制器中调用的操作中也发生了速率限制。不过,我没有在新的 Laravel 安装上检查这个,所以我不想在这里下结论。
总之,长话短说:作为一种替代方法,你可以简单地注册一个速率限制在你的一些供应商,例如“登录”键AppServiceProvider或AuthServiceProvider:
public function boot()
{
RateLimiter::for("login", function () {
Limit::perMinute(5);
});
}
编辑:
我刚刚意识到“登录”键的速率限制器确实由FortifyServiceProvider类中的 Fortify 提供。如果你碰巧有类似于上文讨论的一个问题,请确保您添加的FortifyServiceProvider类到您providers的阵列config/app.php。
- While this will work, busting your cache on every user login is probably not the best way to go about it.