Получение количества попыток входа в GET или при рендеринге представления в Laravel

#laravel #laravel-authentication

#laravel #laravel-аутентификация

Вопрос:

Я разрабатываю веб-приложение с использованием Laravel. Что я пытаюсь сделать сейчас, так это получить количество попыток входа в систему в представлении GET или render. Я могу получить количество попыток входа в систему в запросе post (метод validateLogin) LoginController следующим образом.

 $this->limiter()->attempts($this->throttleKey($request))
  

Дело в том, что метод validateLogin принимает один параметр, Request $request . Что мне нравится делать, так это то, что мне нравится получать количество неудачных попыток входа в систему или количество попыток в методе showLoginForm LoginController. Я переопределяю метод showLoginForm. Я попробовал это.

 $this->limiter()->attempts($this->throttleKey(request()))
  

Но он всегда возвращает ноль. Итак, как я могу получить количество попыток входа в систему в методе GET или showLoginForm LoginController?

Ответ №1:

При сбое входа в систему увеличьте число, при успешном входе в систему удалите попытки. Это можно сделать с помощью сеансов. С помощью сеансов вы можете использовать его в блейд-файлах и в ваших контроллерах.

В вашем app/Http/Controllers/Auth/LoginController.php файле:

 use IlluminateHttpRequest;

/**
 * Get the failed login response instance.
 *
 * @param  IlluminateHttpRequest  $request
 * @return SymfonyComponentHttpFoundationResponse
 *
 * @throws IlluminateValidationValidationException
 */
protected function sendFailedLoginResponse(Request $request)
{
    $attempts = session()->get('login.attempts', 0); // get attempts, default: 0
    session()->put('login.attempts', $attempts   1); // increase attempts

    throw ValidationException::withMessages([
        $this->username() => [trans('auth.failed')],
    ]);
}

/**
 * The user has been authenticated.
 *
 * @param  IlluminateHttpRequest  $request
 * @param  mixed  $user
 * @return mixed
 */
protected function authenticated(Request $request, $user)
{
    session()->forget('login.attempts'); // clear attempts
}
  

Затем в ваших представлениях или контроллерах вы можете просто получить номер из сеанса:

 {{ session()->get('login.attempts', 0) }}
  

Комментарии:

1. Просто обратите внимание, что ThrottlesLogins признак подсчитывает количество попыток входа в систему для данного адреса электронной почты, тогда как это будет учитывать попытки входа в систему для сеанса, поэтому вы можете получить некоторые несоответствия. Например, login.attempts значение может быть выше вашего maxAttempts значения.

Ответ №2:

Когда мы смотрим на throttleKey метод, мы видим, что он создает ключ из адреса электронной почты, с которым пользователь пытался войти в систему, и IP-адреса пользователя. IP-адрес уже должен быть в $request объекте, если вы добавите его в качестве параметра к showLoginForm методу, но адреса электронной почты там не будет. Вы можете добавить его с помощью old вспомогательной функции.

 public function showLoginForm(Request $request)
{

    $request->merge(['email' => old('email')]);

    Log::info($this->limiter()->attempts($this->throttleKey($request)));

    return view('auth.login');
}
  

Редактировать:
Другим способом сделать это было бы перезаписать sendFailedLoginResponse метод и добавить количество попыток в пакет ошибок. Например, в вашем LoginController :

 protected function sendFailedLoginResponse(Request $request)
{
    throw ValidationException::withMessages([
        $this->username() => [trans('auth.failed')],
        'attempts' => $this->limiter()->attempts($this->throttleKey($request)),
    ]);
}
  

Затем вы можете получить количество попыток в вашем шаблоне с помощью <strong>{{ $errors->first('attempts') }}</strong>