#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>