用于编辑帐户中密码字段的Laravel 4验证器

时间:2013-07-27 16:02:34

标签: php validation laravel laravel-4

我需要检查用户是否发布了与数据库中密码相同的密码。旧密码的字段是'oldpass'。我创建的自定义验证器称为“passcheck”。它应该失败或相应地传递。

下面的我的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);

3 个答案:

答案 0 :(得分: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());
});

答案 1 :(得分: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());
});

答案 2 :(得分:4)

请不要将您的规则绑定到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);