2016-06-01 25 views
8

は私が正しく、その後、私は新しいパスワードでログインすることができ、私はnew_passwordフィールドを記入した場合、それがハッシュされ、データベースに送信されます、現時点ではパスワードルート、ビューおよび方法[email protected]中と[email protected]Laravel 5で現在のパスワード、新しいパスワード、新しいパスワードの確認を確認するにはどうすればよいですか?

を作成しました。

しかし、new_passwordnew_password_confirmが同じであることを確認し、ユーザーの現在のパスワードも検証できるようにする必要があります。

どうすればいいですか?

EDIT:私はこのメソッドに$this->validateを追加しましたが、今では単純なパスワードを使用しているので一致してもエラーThe password confirmation confirmation does not match.が続きます。また、私はvalidatorが私のためにそれをしないので、現在のパスワードと手動で照合する必要があると思います。

public function getProfilePassword(Request $request) { 
    return view('profile/password', ['user' => Auth::user()]); 
} 

public function postProfilePassword(Request $request) { 
    $user = Auth::user(); 

    $this->validate($request, [ 
     'old_password'   => 'required', 
     'password'    => 'required|min:4', 
     'password_confirmation' => 'required|confirmed' 
    ]); 

    $user->password = Hash::make(Input::get('new_password')); 
    $user->save(); 
} 

そしてこれは、ユーザーが入力した古いパスワードが正しいかどうかを確認することができますHash::check()機能がありますビュー

<form action="{{ route('profile/updatepassword') }}" method="post" enctype="multipart/form-data"> 
    <div class="form-group"> 
      <label for="name">Current Password</label> 
      <input type="password" name="old_password" class="form-control" id="old_password"> 
    </div> 
    <div class="form-group"> 
      <label for="name">Password</label> 
      <input type="password" name="password" class="form-control" id="password"> 
    </div> 
    <div class="form-group"> 
      <label for="name">New Password</label> 
      <input type="password" name="password_confirmation" class="form-control" id="password_confirmation"> 
    </div> 
    <button type="submit" class="btn btn-primary">Change Password</button> 
    <input type="hidden" value="{{ Session::token() }}" name="_token"> 
</form> 

答えて

29

です。

usage

if (Hash::check("param1", "param2")) { 
//add logic here 
} 

param1 - user password that has been entered on the form 
param2 - old password hash stored in database 

古いパスワードが正しく入力されている場合、それはtrueを返します、あなたは、あなたは、フォームの要求であなたの検証を追加することができ、同じようにnew_passwordnew_confirm_passwordのためにあなたのロジックに応じて

を追加することができますlike

'new_password' => 'required', 
'new_confirm_password' => 'required|same:new_password' 
+0

は、これらの便利なヒントをいただき、ありがとうございます。私は 'same:new_password'の代わりに' confirmation'を使っていました。ちょうどそれを変更して動作させました。そして、 'Hash :: check()'を使って現在のパスワードを検証します。 – Halnex

+0

助けてくれてうれしいです:) – Sid

+6

確認フィールドで使うもう1つの良いトリック: 'confirmed'検証ルール<[link](https://laravel.com/docs/5.4/validation#rule-confirmed)> 実際のルールは、次のように1行になります。 ''new_password' => 'required | confirmed''。確認フィールド名は 'new_password_confirmation'でなければなりません。 – Corner

3

あなたはconfirmedを追加することができますパスワード。 そして'required|confirmed'あなたはpasswordpassword confirmation

'old_password' => 'required|confirmed', 'password' => 'required|min:4', 'password_confirmation' => 'required|same:password'

幸運を比較する'required|same:password'に変更!

+2

確認済み検証では、一致するフィールドがfoo_confirmationである必要があります。たとえば、検証中のフィールドがパスワードである場合、一致するpassword_confirmationフィールドが入力に存在する必要があります。 –

+0

これはドキュメントによると間違っています:https://laravel.com/docs/5.1/validation#rule-確認 – Jonjie

0

カスタム検証ルールを作成することでこれを行うことができます(この例では、入力名としてcurrent_passwordnew_passwordを使用しています)。

AppServiceProvider::boot()でこれを入れて:

Validator::extend('current_password', function ($attribute, $value, $parameters, $validator) { 
    $user = User::find($parameters[0]); 

    return $user && Hash::check($value, $user->password); 
}); 

今、あなたはあなたのコントローラで次のように使用することができます。

$user = auth()->user(); // or pass an actual user here 

$this->validate($request, [ 
    'current_password' => 'required_with:new_password|current_password,'.$user->id, 
]); 
関連する問題