2013-07-27 6 views
10

ユーザがデータベースのパスワードと同じパスワードを投稿したかどうかを確認する必要があります。古いパスワードのフィールドは 'oldpass'です。作成したカスタムバリデーターはパスチェックと呼ばれます。これは失敗するか、それに応じて渡されます。編集アカウントのパスワードフィールドのLaravel 4バリデータ

以下のMy UsersControllerコードは機能しません。何が私が間違っていた可能性がありますか?

$rules = array(
     'oldpass' => 'passcheck', 
    ); 

    $messages = array(
     'passcheck' => 'Your old password was incorrect', 
    ); 


    Validator::extend('passcheck', function($attribute, $value, $parameters) 
    { 
     if(!DB::table('users')->where('password', Hash::make(Input::get('oldpass')))->first()){ 
      return false; 
     } 
     else{ 
      return true; 
     }; 
    }); 

    $validator = Validator::make($inputs, $rules, $messages); 
+0

質問は何ですか? –

+0

Hehe、@ TryingTobemyselfRahul質問を更新しました。訂正してくれてありがとう。 – TechyTimo

答えて

19

あなたはこのようなものを使用する必要があり、

$user = DB::table('users')->where('username', 'someusername')->first(); 
if (Hash::check(Input::get('oldpass'), $user->password)) { 
    // The passwords match... 
    return true; 
} 
else { 
    return false; 
} 

だから、あなたはusernameやその他のfieldを使用してレコードを取得し、パスワードを確認する必要があります。

@lucasmichotはさらに短いソリューションを提供しました:

Validator::extend('passcheck', function ($attribute, $value, $parameters) 
{ 
    return Hash::check($value, Auth::user()->getAuthPassword()); 
}); 
+0

ありがとうございました!他の入力がハッシュされていないのはどうでしょうか?たとえば、次のもので使用しようとしているチェックボックスなどです:\t \t if(Input :: get( 'termsandconditions')== '0'){return false;} else {return true;} ;}); – TechyTimo

+2

あなたは歓迎です、 'if(Input :: get( 'termsandconditions')== 0 {//チェックされていない}'、[accepted](http://four.laravel.com/docs/validation#rule承認された)検証ルール。 –

4

HTML要素に、あなたのルールを結ぶいけないしてください。 Laravelが提供するパラメータを使用してカスタムルールを作成します。これは、(あなたが認証されたユーザーを持っていることをasuming)のようになります。

Validator::extend('passcheck', function($attribute, $value, $parameters) { 
    return Hash::check($value, Auth::user()->password); // Works for any form! 
}); 

$messages = array(
    'passcheck' => 'Your old password was incorrect', 
); 

$validator = Validator::make(Input::all(), [ 
    'oldpass' => 'passcheck', 
    // more rules ... 
], $messages); 
6

私はこのようなことになるだろう:

/** 
* Rule is to be defined like this: 
* 
* 'passcheck:users,password,id,1' - Means password is taken from users table, user is searched by field id equal to 1 
*/ 
Validator::extend('passcheck', function ($attribute, $value, $parameters) { 
    $user = DB::table($parameters[0])->where($parameters[2], $parameters[3])->first([$parameters[1]]); 
    if (Hash::check($value, $user->{$parameters[1]})) { 
     return true; 
    } else { 
     return false; 
    } 
}); 

このバリデータルールは、データベースのクエリは、現在のユーザーのパスワード

をチェックするようになりますクエリを短くして保存することができます:

Validator::extend('passcheck', function ($attribute, $value, $parameters) { 
    return Hash::check($value, Auth::user()->getAuthPassword()); 
}); 
関連する問題