2013-07-27 59 views
10

我需要檢查用戶是否發佈了與數據庫中相同的密碼。舊密碼字段爲'oldpass'。我創建的自定義驗證器被稱爲「passcheck」。它應該失敗或相應通過。編輯帳戶中的密碼字段Laravel 4驗證程序

下面的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

呵呵,@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

非常感謝!如果其他輸入沒有被散列,例如一個imbox嘗試使用的複選框:\t \t if(Input :: get('termsandconditions')=='0'){return false;} else {return true;} ;}); – TechyTimo

+2

不客氣,'if(Input :: get('termsandconditions')== 0){// not checked}',也檢查[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()); 
});