Laravel 8 Fortify login говорит: 429 СЛИШКОМ МНОГО ЗАПРОСОВ

У меня проблема, связанная с 429 СЛИШКОМ МНОГО ЗАПРОСОВ. Я использовал Laravel fortify, и мой веб-маршрут похож на

Route::get('/', function () {
    return view('welcome');
});

Route::get('/dashboard','DashboardController@dashboardView')
    ->name('dashboard')->middleware('auth');

Проблема возникает периодически, после успешного входа в систему я перенаправлялся на панель управления, если сразу же выхожу из системы и сразу же пытаюсь войти в систему, она выдает 429 СЛИШКОМ МНОГО ЗАПРОСОВ, а в адресной строке URL-адрес http://127.0.0.1:8000/login. Теперь, если я подожду секунду и обновлю страницу, она перенаправит на страницу панели инструментов.

Я искал в Интернете, все говорят о дроссельной заслонке, и я не вижу в этом решения. Помогите, пожалуйста. Спасибо.


person Livetuts Bj    schedule 02.02.2021    source источник


Ответы (1)


Сегодня я наткнулся на ту же проблему и немного отладил. При регистрации маршрута / login Fortify применяет к нему Illuminate\Routing\Middleware\ThrottleRequests:login промежуточное ПО. Это означает, что для каждого запроса к этому маршруту промежуточное ПО ThrottleRequests будет вызывать RateLimiter экземпляр для этого указанного ключа. Судя по всему, Fortify не регистрирует RateLimiter для ключа login.

Из-за отсутствия ключа в свойстве $limiters экземпляра RateLimiter промежуточное ПО ThrottleRequests использует резервный вариант по умолчанию, который не обрабатывает крайний случай, ДОЛЖЕН быть ограничитель скорости для этого ключа, но его нет. Очень хорошо. Для переменной $maxAttempts установлено значение 0, что приведет к нестабильному ограничению скорости.

Мне кажется, что это ошибка в Fortify, потому что ограничение скорости также происходит в действии \Laravel\Fortify\Actions\EnsureLoginIsNotThrottled, которое вызывается в контроллере \Laravel\Fortify\Http\Controllers\AuthenticatedSessionController. Однако я не проверял это на новой установке Laravel, поэтому не хочу делать здесь поспешных выводов.

В любом случае, короче: в качестве обходного пути вы можете просто зарегистрировать ограничитель скорости для ключа входа в систему у некоторых из ваших провайдеров, например. грамм. AppServiceProvider или AuthServiceProvider:

public function boot()
{
    RateLimiter::for("login", function () {
        Limit::perMinute(5);
    });
}

Изменить: я только что понял, что ограничитель скорости для ключа входа в систему действительно предоставляется Fortify в классе FortifyServiceProvider. Если у вас возникла проблема, аналогичная описанной выше, убедитесь, что вы добавили класс FortifyServiceProvider в свой массив providers в config/app.php.

person Chris Meh    schedule 07.02.2021
comment
Спасибо за ценный ответ, я решил проблему, сделав это в классе FortifyServiceProvider. В методе загрузки перед вызовом представления входа в систему. Fortify :: loginView (function () {Artisan :: call ('cache: clear'); return view ('forepart.login.user_login');}); - person Livetuts Bj; 07.02.2021
comment
Хотя это будет работать, перебор вашего кеша при каждом входе пользователя в систему, вероятно, не лучший способ сделать это. - person Chris Meh; 07.02.2021