概要
パスワードの変更や特別な操作の際に仕様する「現在のパスワード」を入力してから実行する作業に関する投稿です。
考察
下図のような「現在のパスワード」を確認してから「新しいパスワード」を登録する方法の例です。
現在のパスワードを確認するだけなら、laravelファサードのHash::check()
やPHPのpassword_verify()
をコントローラーに記述して実行できます。
ですが、そこにパスワードのバリデーションを関連付けると両方の処理を同時に実行できないという問題が生じます。
これはlaravelのバリデーションが、値が異なればerrorをreturnしている
からです。
もちろん処理だけなら実行できますが、ユーザーにエラーの原因が見えにくくなり不親切です。
バリデーションルールを作成する
上記の問題を解決するには「現在のパスワード」をバリデーションルールとして作成すれば解決できます。
「現在のパスワード」を確認するという独自の検証ルールを作成することで二度手間になっていた作業を一度で完結できるようになります。
詳細については以下をご参考ください。
【laravel】ruleオブジェクトによる検証ルールの追加
バリデーションルールの作成
ここでは現在のパスワードを検証するためにRules
でCurrentというバリデーションルールを作成します。
Rules
はpasses()
がtrueならバリデーションを通過し、falseならmessage()
を返します。
まずはログインしているアカウントのパスワードを取得するためにAuth()
でパスワードを取得します。
そしてHash()
のcheckメソッドで入力されたパスワードと現在のパスワードを検証します。
public function passes($attribute, $value)
{
$pass = Auth::user()->password;
return (Hash::check($value, $pass));
}
public function message()
{
return 'パスワードが一致しません';
}
バリデーションの実行
バリデーションルールに作成したCurrent
を記述します。
これであとはコントローラーに設定すれば完了です。
新しいパスワードのバリデーションルールはRegisterコントローラーからのコピペです。
'current_password' => new Current(),
'password' => ['string', 'min:8', 'confirmed',],
参考
[Laravel 6.x バリデーション / カスタムバリデーションルール]
(https://readouble.com/laravel/6.x/ja/validation.html#rule-alpha-num)
PHP / password_verify