Throttle機能とは
Throttle機能とは、ログイン失敗時に失敗した場合、一定の指定回数を超えた場合にログインにロックを掛けて、一定の時間を経過したらロックを解除する機能です。
Throttle機能を使う
実装方法は $maxAttemptsと$decayMinutesをLoginController内に設定するだけです。
<?phpclass LoginController extends Controller{ use AuthenticatesUsers; protected $maxAttempts = 5; // 5回失敗したらロックする protected $decayMinutes = 30; // ロックは30分間
ロックした時にメッセージを出すようにする
しかし、$maxAttemptsに設定された回数失敗したらロックされるのですが、ロックされた旨のメッセージは設定した回数失敗した際には表示されません。
ロックしたらその時に知らせてほしいものです。そこで、ロックしたメッセージがすぐに表示されるようにしてみます。
ロックのエラー処理は、loginメソッド内でやっています。 ログイン判定前に、処理をしているようなので、ログイン判定後に改めてロックの判定を行うように追記します。
<?php public function login(Request $request) { $this->validateLogin($request); if (method_exists($this, 'hasTooManyLoginAttempts') && $this->hasTooManyLoginAttempts($request)) { $this->fireLockoutEvent($request); return $this->sendLockoutResponse($request); } if ($this->attemptLogin($request)) { return $this->sendLoginResponse($request); } $this->incrementLoginAttempts($request); // このif文を追記 if (method_exists($this, 'hasTooManyLoginAttempts') && $this->hasTooManyLoginAttempts($request)) { $this->fireLockoutEvent($request); return $this->sendLockoutResponse($request); } return $this->sendFailedLoginResponse($request); }
これでロックしたらすぐにメッセージが出るようになります。
失敗回数はログインID毎ではなく全体での回数にする
Laravelではログインの失敗のカウントは、ログインID毎に判別しているようです。
つまり、あるアカウントはロックされても、別のアカウントならログイン可能ということです。 これを全体で失敗した回数にしたいと思います。
throttleKeyというメソッドでログインを判別するためのキーを生成しているので、これをLoginController内でオーバーライドして修正します。
Str::lower($request->input($this->username())).’|’.$request->ip()となっていて、ログイン名(通常はemail)とIPを元にキーを生成しています。 このキーを元にカウントアップするので、アカウントごとに失敗した回数が設定されるというわけですね。
なので、ここを以下のように修正します。
protected function throttleKey(Request $request) { return $request->ip(); }
これでアカウントは関係なく同一IPからの失敗でカウントされるようになります。
以上になります。参考にされてくださいね。