2017-10-18 150 views
0

我想检查数据库中特定用户的密码是否正确。我想为此使用Laravel验证Laravel验证检查是否存在密码

。 这里是我当前的代码

$validator = $request->validate([ 
     'password' => ['required',Rule::exists('users')->where(function ($query) { $query->where('id',Auth::id()); })] 
    ]); 

我想这生成查询

select count(*) as aggregate from `users` where `password` = 123 and id = 1)) 

现在缺少的是,我要被散列这个密码(123),以获得适当的检查。 目前,我得到验证错误

选择的密码无效

即使我输入正确的密码

+0

请参阅https://laravel.com/docs/5.5/hashing'Hash :: check()' – ventaquil

+0

为什么不创建自定义验证规则?请参阅:https://laravel.com/docs/5.5/validation#custom-validation-rules – Jeffrey

+0

如果您想检查散列密码,请执行如下操作:'$ user = \ App \ Models \ User :: findOrFail($ user_id) ; $ check_password = Hash :: check($ request-> password,$ user-> password);' –

回答

2

在这种情况下,你应该创建自己的Validation Rule以下this instructions

php artisan make:rule ValidatePassword 

在生成的文件中,为re添加构造方法ceive要验证密码,防止

public function __construct(User $user) 
{ 
    $this->user = $user; 
} 

用户你应该写的逻辑为passes方法内检查密码

public function passes($attribute, $value) 
{ 
    return Hash::check($value, $this->user->password); 
} 

然后,您可以使用它像

$validator = $request->validate([ 
    'password' => ['required', new ValidatePassword(auth()->user())] 
]); 

请务必导入User,ValidatePasswordHash,为了简洁,我跳过了这一点。

+1

我建议通过'ValidatePassword'类的构造函数传递'User'对象。这似乎是一个通用规则,并且您假设它始终用于当前通过身份验证的用户。 – Jeffrey

+0

auth() - > user() - >密码如何从数据库中获取哈希密码。 –

+0

@YasirIjaz'auth() - > user()'获取当前登录的用户。但正如@Jeffrey所建议的那样,最好将用户作为参数传递给用户。我将编辑该答案 – Lloople