LoginSignup
7
4

More than 1 year has passed since last update.

【laravel】「現在のパスワード」をチェックするバリデーション

Last updated at Posted at 2020-05-28

概要

パスワードの変更や特別な操作の際に仕様する「現在のパスワード」を入力してから実行する作業に関する投稿です。

考察

下図のような「現在のパスワード」を確認してから「新しいパスワード」を登録する方法の例です。

screenshot_20200528_131703.png

現在のパスワードを確認するだけなら、laravelファサードのHash::check()やPHPのpassword_verify()をコントローラーに記述して実行できます。
ですが、そこにパスワードのバリデーションを関連付けると両方の処理を同時に実行できないという問題が生じます。
これはlaravelのバリデーションが、値が異なればerrorをreturnしているからです。
もちろん処理だけなら実行できますが、ユーザーにエラーの原因が見えにくくなり不親切です。

バリデーションルールを作成する

上記の問題を解決するには「現在のパスワード」をバリデーションルールとして作成すれば解決できます。
「現在のパスワード」を確認するという独自の検証ルールを作成することで二度手間になっていた作業を一度で完結できるようになります。

詳細については以下をご参考ください。
【laravel】ruleオブジェクトによる検証ルールの追加

バリデーションルールの作成

ここでは現在のパスワードを検証するためにRulesでCurrentというバリデーションルールを作成します。
Rulespasses()がtrueならバリデーションを通過し、falseならmessage()を返します。

まずはログインしているアカウントのパスワードを取得するためにAuth()でパスワードを取得します。
そしてHash()のcheckメソッドで入力されたパスワードと現在のパスワードを検証します。

Current.php
public function passes($attribute, $value)
{
  $pass = Auth::user()->password;
  return (Hash::check($value, $pass));
}

public function message()
{
  return 'パスワードが一致しません';
}

バリデーションの実行

バリデーションルールに作成したCurrentを記述します。
これであとはコントローラーに設定すれば完了です。
新しいパスワードのバリデーションルールはRegisterコントローラーからのコピペです。

.php
'current_password' => new Current(),
'password' => ['string', 'min:8', 'confirmed',],

参考

Laravel 6.x バリデーション / カスタムバリデーションルール
PHP / password_verify

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4