laravel 6で、パスワードブローカーは次のようにしてパスワードのリセットを抑制します( https://github.com/laravel/framework/blob/6.x/src/Illuminate/ Auth/Passwords/PasswordBroker.php#L58 )
public function sendResetLink(array $credentials)
{
// First we will check to see if we found a user at the given credentials and
// if we did not we will redirect back to this current URI with a piece of
// "flash" data in the session to indicate to the developers the errors.
$user = $this->getUser($credentials);
if (is_null($user)) {
return static::INVALID_USER;
}
if (method_exists($this->tokens, 'recentlyCreatedToken') &&
$this->tokens->recentlyCreatedToken($user)) {
return static::RESET_THROTTLED;
}
// Once we have the reset token, we are ready to send the message out to this
// user with a link to reset their password. We will then redirect back to
// the current URI having nothing set in the session to indicate errors.
$user->sendPasswordResetNotification(
$this->tokens->create($user)
);
return static::RESET_LINK_SENT;
}
しかし、パスワードリセットを繰り返し送信すると、なぜパスワードリセットが抑制されないのですか?それでもリセット通知が送信されますか?
recentlyCreatedToken
メソッドがバージョン6.xのTokenRepositoryInterfaceに存在しないことに気づきました https://github.com/laravel/framework/blob/6.x/src/Illuminate/Auth/ Passwords/TokenRepositoryInterface.php
しかし、バージョン7.xで追加されました
これはv7.xの機能だけですか、それとも欠落していることを実行する必要がありますか?
パスワードリセットスロットリングはLaravel 6.xで機能しますが、何らかの理由で設定ファイルconfig/auth.php
でthrottle
パラメータを手動で設定する必要があります:
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
'throttle' => 60, // Allows a user to request 1 token per 60 seconds
],
],
DatabaseTokenRepository は、スロットル時間のデフォルト値を60秒に定義します。ただし、DatabaseTokenRepositoryが PasswordBrokerManager で初期化されると、構成ファイルがチェックされ、値が見つからない場合はスロットル時間が0に設定されます(スロットルを無効にすることを意味します)。
また、ユーザーにわかりやすいエラーメッセージを表示するには、メッセージ文字列をresources/lang/en/passwords.php
に追加する必要があります。
'throttled' => 'You have requested password reset recently, please check your email.',
P. S. php artisan config:clear
を使用して構成ファイルを編集した後、構成キャッシュをフラッシュすることを忘れないでください。