【问题标题】:Laravel 4 validator for password field in edit account编辑帐户中密码字段的 Laravel 4 验证器
【发布时间】:2013-07-27 19:25:58
【问题描述】:

我需要检查用户是否发布了与数据库中相同的密码。旧密码字段为“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);

【问题讨论】:

  • 那么问题是什么?
  • 呵呵,@TryingTobemyselfRahul 我刚刚更新了这个问题。感谢您的指正。请检查

标签: php validation laravel laravel-4


【解决方案1】:

我会这样:

/**
 * 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】:

    你应该使用这样的东西,

    $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());
    });
    

    【讨论】:

    • 非常感谢!没有散​​列的任何其他输入怎么样,例如我尝试使用的复选框: if(Input::get('termsandconditions') == '0'){return false;}else{return true;};} );
    • 不客气,if(Input::get('termsandconditions') == 0) { // not checked },同时检查accepted验证规则。
    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2014-03-17
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-21
      • 2013-06-29
      相关资源
      最近更新 更多