Получение количества попыток входа в систему в GET или при рендеринге представления в Laravel - PullRequest
0 голосов
/ 08 апреля 2019

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

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

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

use Illuminate\Http\Request;

/**
 * Get the failed login response instance.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Symfony\Component\HttpFoundation\Response
 *
 * @throws \Illuminate\Validation\ValidationException
 */
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  \Illuminate\Http\Request  $request
 * @param  mixed  $user
 * @return mixed
 */
protected function authenticated(Request $request, $user)
{
    session()->forget('login.attempts'); // clear attempts
}

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

{{ session()->get('login.attempts', 0) }}
0 голосов
/ 08 апреля 2019

Когда мы посмотрим на метод 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>

...