1

Laravelを使用してWebアプリケーションを開発しています。私が今やろうとしているのは、GET またはレンダリング ビューでログイン試行回数を取得しようとしていることです。LoginController の POST リクエスト(validateLogin メソッド)でログイン試行回数を取得するには、次のようにします。

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

問題は、validateLogin メソッドが Request $request という 1 つのパラメーターを取ることです。私がやりたいことは、LoginController の showLoginForm メソッドで失敗したログイン試行の回数または試行回数を取得することです。showLoginForm メソッドをオーバーライドしています。これを試しました。

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

しかし、それは常にゼロを返します。では、LoginController の GET または showLoginForm メソッドでログイン試行回数を取得するにはどうすればよいでしょうか?

4

2 に答える 2

3

ログインに失敗した場合は数字を増やし、ログインに成功した場合は試行をクリアします。これは、セッションを使用して実行できます。セッションを使用すると、ブレード ファイルとコントローラーで使用できます。

あなたの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) }}
于 2019-04-08T12:29:12.360 に答える
1

throttleKeyメソッドを見ると、ユーザーがログインに使用したメール アドレスとユーザーの IP アドレスからキーが作成されることがわかります。$requestメソッドにパラメーターとして追加する場合、IP アドレスは既にオブジェクトに含まれているはずです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>

于 2019-04-08T12:57:45.707 に答える