Валидатор Laravel 4 для поля пароля в учетной записи редактирования
Мне нужно проверить, зарегистрировал ли пользователь тот же пароль, что и тот, который находится в базе данных. Поле для старого пароля - "oldpass". Созданный пользовательский валидатор называется "passcheck". Он должен потерпеть неудачу или пройти соответственно.
Мой код UserController ниже не работает. Что я мог сделать неправильно?
$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);
Ответы
Ответ 1
Вы должны использовать что-то вроде этого,
$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());
});
Ответ 2
Я бы сделал так:
/**
* 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());
});
Ответ 3
Пожалуйста, не связывайте свое правило с элементом Html. Используйте параметры Laravel для создания ваших пользовательских правил. Это будет (при условии, что вы аутентифицировали пользователя):
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);