Как скрыть форму входа после достижения общего количества неудачных попыток входа?

Я хочу скрыть форму входа и вместо этого отобразить сообщение об ошибке, но не могу.

Я попытался поместить код ниже, который переписывает действие на контроллере, который показывает форму, но метод, который проверяет слишком много попыток входа в систему, похоже, не работает и никогда не возвращает true.

public function showLoginForm(Request $request)
{
    if (method_exists($this, 'hasTooManyLoginAttempts') &&
        $this->hasTooManyLoginAttempts($request) ) {
            $seconds = $this->limiter()->availableIn($this->throttleKey($request));
            return view('auth.block', array(
                'seconds' => $seconds
            ));
    }

    return view('auth.login');
}

Я управлял процессом аутентификации с помощью php artisan make: контроллер входа в систему по умолчанию сгенерирован Laravel, единственное изменение заключается в действии, которое отображает форму.


person Rafael Paulino    schedule 13.08.2019    source источник


Ответы (2)


Глядя на код Laravel, он проверяет hasTooManyLoginAttempts на основе throttleKey и maxAttempts.

throttleKey зависит от электронной почты и IP-адреса пользователя. Таким образом, вывод следующего кода выглядит примерно так: [email protected]|127.0.0.1 и это ваш throttleKey.

protected function throttleKey(Request $request)
{
    return Str::lower($request->input($this->username())).'|'.$request->ip();
}

Теперь Laravel получает адрес электронной почты пользователя (имя пользователя) от $request->input($this->username()), когда вы отправляете запрос POST, к которому у вас нет доступа в методе showLoginForm, поскольку он вызывается в запросе GET.

В любом случае, если вы хотите заблокировать форму входа, вам нужно будет придумать свой собственный уникальный throttleKey, а затем переопределить метод. Допустим, вы хотите, чтобы ваш throttleKey основывался только на IP-адресе, что не рекомендуется. Вот как это сделать:

// In LoginController.php 

protected function throttleKey(Request $request)
{
    return $request->ip();
}
person Ahmad H.    schedule 13.08.2019

Функция hasTooManyLoginAttempts() нуждается в $request, username (обычно электронная почта) в качестве ключа, чтобы узнать, достиг ли user своего максимального количества попыток входа в систему.

Если в $request нет username со значением, функция не сможет проверить user попыток входа.

Таким образом, вы не можете точно знать, кто является пользователем, который хочет get войти в вашу форму, вы знаете, кто только после отправки формы.

ИМХО, единственным способом может быть добавление параметра username в запрос GET, но вы должны предоставить ему некоторые обходные пути: файлы cookie, сеанс и т. д.

person dparoli    schedule 13.08.2019