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からの失敗でカウントされるようになります。
以上になります。参考にされてくださいね。

