【Laravel6】Auth認証機能のアカウントロックの回数と時間を変更する方法

Laravel

スポンサーリンク

LaravelのAuth認証機能を導入すると、デフォルトでアカウントロック機能が有効になっています。

デフォルトではログインで5回失敗すると60秒間ロックされるようになっています。

この回数と時間を変更したい場合のやり方を説明します。

[app/Http/Controllers/Auth/LoginController.php]

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * ログイン試行回数(回)
     * @var int
     */
    protected $maxAttempts = 1;

    /**
     * ログインロックタイム(分)
     */
    protected $decayMinutes = 2;

// 以下省略

この二つの定義を追加します。

protected $maxAttempts = 1;
protected $decayMinutes = 2;

今回の例だと、1回失敗すると2分間アカウントロックされるようになります。

ちなみにエラーが「~秒後」となっていますが、これを「~分後」としたければ、以下を変えればできます。

[resources/lang/ja/auth.php]

// 'throttle' => 'アカウントがロックされました。:seconds秒後に再度お試しください。'
'throttle' => 'アカウントがロックされました。:minutes分後に再度お試しください。'

ちなみにデフォルトではエラーメッセージは英語です。日本語化する方法は以下を参照。

さて、これらの設定でなぜアカウントロックの設定が変えれることができるのかを説明します。

まず、LoginController.phpは「use AuthenticatesUsers;」の記載があります。

[app/Http/Controllers/Auth/LoginController.php]

use AuthenticatesUsers;

AuthenticatesUsersトレイトを見るとuseで「ThrottlesLogins」が記載されています。

[vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php]

use RedirectsUsers, ThrottlesLogins;

ThrottlesLoginsトレイトを見ると、

[vendor/laravel/framework/src/Illuminate/Foundation/Auth/ThrottlesLogins.php]※一部抜粋

protected function sendLockoutResponse(Request $request)
{
    $seconds = $this->limiter()->availableIn(
        $this->throttleKey($request)
    );

    throw ValidationException::withMessages([
        $this->username() => [Lang::get('auth.throttle', [
            'seconds' => $seconds,
            'minutes' => ceil($seconds / 60),
        ])],
    ])->status(Response::HTTP_TOO_MANY_REQUESTS);
}

public function maxAttempts()
{
    return property_exists($this, 'maxAttempts') ? $this->maxAttempts : 5;
}

public function decayMinutes()
{
    return property_exists($this, 'decayMinutes') ? $this->decayMinutes : 1;
}

上の「maxAttempts()」と「decayMinutes()」を見ると、

maxAttempts()→maxAttemptsプロパティがあればその値を設定、してなければ「5」を設定

decayMinutes()→decayMinutesプロパティがあればその値を設定、してなければ「1」を設定

ということで、初期状態だとmaxAttemptsとdecayMinutesプロパティは設定されていないので、アカウントロックの条件が5回と1分だったんですね。

なので、条件を変えたいときは、LoginController.phpにこのプロパティを設定してあげました。

ちなみに、sendLockoutResponseメソッドは、以下のような記載があり、

$this->username() => [Lang::get('auth.throttle', [
    'seconds' => $seconds,
    'minutes' => ceil($seconds / 60),

これによって、エラーメッセージの以下の「:seconds」を「:minutes」に変更すると秒表示から分表示になります。

[resources/lang/ja/auth.php]

// 'throttle' => 'アカウントがロックされました。:seconds秒後に再度お試しください。'
'throttle' => 'アカウントがロックされました。:minutes分後に再度お試しください。'

以上です。

Laravel

Posted by ton