如何在Laravel 5中验证当前,新的和新的密码确认?

Hal*_*nex 13 php laravel laravel-5 laravel-5.2

我在UserController@getProfilePassword和中创建了密码路由,视图和方法UserController@postProfilePassword

目前,如果我填写该new_password字段,它会被哈希并正确提交到数据库,然后我可以使用新密码登录.

但我需要能够验证new_passwordnew_password_confirm确保它们相同并验证用户的当前密码.

我怎样才能做到这一点?

编辑:我添加$this->validate到该方法,但现在我不断得到错误,The password confirmation confirmation does not match.即使他们匹配,因为我使用简单的密码.此外,我认为我需要手动检查当前密码validator,因为我不会这样做.

public function getProfilePassword(Request $request) {
    return view('profile/password', ['user' => Auth::user()]);
}

public function postProfilePassword(Request $request) {
    $user = Auth::user();

    $this->validate($request, [
        'old_password'          => 'required',
        'password'              => 'required|min:4',
        'password_confirmation' => 'required|confirmed'
    ]);

    $user->password = Hash::make(Input::get('new_password'));
    $user->save();
}
Run Code Online (Sandbox Code Playgroud)

这就是观点

<form action="{{ route('profile/updatepassword') }}" method="post" enctype="multipart/form-data">
    <div class="form-group">
          <label for="name">Current Password</label>
          <input type="password" name="old_password" class="form-control" id="old_password">
    </div>
    <div class="form-group">
          <label for="name">Password</label>
          <input type="password" name="password" class="form-control" id="password">
    </div>
    <div class="form-group">
          <label for="name">New Password</label>
          <input type="password" name="password_confirmation" class="form-control" id="password_confirmation">
    </div>
    <button type="submit" class="btn btn-primary">Change Password</button>
    <input type="hidden" value="{{ Session::token() }}" name="_token">
 </form>
Run Code Online (Sandbox Code Playgroud)

Sid*_*Sid 44

有一个Hash::check()功能可以让你检查用户输入的旧密码是否正确.

usage

if (Hash::check("param1", "param2")) {
 //add logic here
}

param1 - user password that has been entered on the form
param2 - old password hash stored in database
Run Code Online (Sandbox Code Playgroud)

如果正确输入旧密码,它将返回true,您可以相应地添加逻辑

为了new_passwordnew_confirm_password相同,您可以在表单请求中添加您的验证

'new_password' => 'required',
'new_confirm_password' => 'required|same:new_password'
Run Code Online (Sandbox Code Playgroud)

  • 在确认字段中使用的另一个好方法:"确认"验证规则<[link](https://laravel.com/docs/5.4/validation#rule-confirmed)>.你的实际规则只有一行,如:`'new_password'=>'required | confirmed'`.确认字段名称应为"new_password_confirmation". (10认同)

Ara*_*our 15

password根据文档,在 Laravel 6 中有一个名为 的新规则

验证字段必须与已验证用户的密码匹配。您可以使用规则的第一个参数指定身份验证保护:
'password' => 'password:api'

所以验证规则可以很简单:

'current_password' => 'required|password',
'password' => 'required|string|min:8|confirmed',
Run Code Online (Sandbox Code Playgroud)

  • 注意:您必须使用 `current_password` 而不是 laravel 8 文档中提到的 `password`。https://laravel.com/docs/8.x/validation#rule-password (3认同)

Ste*_*eve 10

如果在整个应用程序中只需要一次自定义规则的功能,则可以使用闭包代替规则对象。Closure接收属性的名称,属性的值,以及在验证失败时应调用的$ fail回调

$request->validate([
    'new_password' => 'required|confirmed|min:4',
    'current_password' => ['required', function ($attribute, $value, $fail) use ($user) {
        if (!\Hash::check($value, $user->password)) {
            return $fail(__('The current password is incorrect.'));
        }
    }],
]);
Run Code Online (Sandbox Code Playgroud)

https://laravel.com/docs/5.6/validation#using-closures

  • 谢谢,我只是在寻找这种解决方案。 (3认同)
  • 谢谢,我正在找这个! (3认同)

kjd*_*n84 5

您可以通过创建自定义验证规则(对于此示例,我使用current_passwordnew_password作为输入名称)来完成此操作。

把这个放在AppServiceProvider::boot()

Validator::extend('current_password', function ($attribute, $value, $parameters, $validator) {
    $user = User::find($parameters[0]);

    return $user && Hash::check($value, $user->password);
});
Run Code Online (Sandbox Code Playgroud)

现在您可以在控制器中使用以下内容:

$user = auth()->user(); // or pass an actual user here

$this->validate($request, [
    'current_password' => 'required_with:new_password|current_password,'.$user->id,
]);
Run Code Online (Sandbox Code Playgroud)