使用已确认规则更新密码无效

时间:2018-03-31 12:15:02

标签: php laravel

我有一个updatePassword方法来更新用户的密码。

有一些规则:

- the introduced actual password should be equal to the actual password of the user (users table has a column "password" on db)
- the new_password and new_password_confirm should be equal
- the actual_password and new_password should be different

我有以下代码。但它似乎总是验证错误"实际密码确认不匹配。"即使引入的实际密码是正确的。

你知道错误在哪里吗?

 public function updatePassword(Request $request){
            $this->validate($request, [
            'actual_password' => 'required|string|min:6|confirmed',
            'new_password' => 'required|string|min:6',
            'new_password_confirm' => 'required|string|min:6|same:new_password',
            ]);

            $user = Auth::user();
            $user->password = bcrypt($request->new_password);
            $user->save();

            Session::flash('success', 'updated.');

            return redirect()->back();
        }

形式:

<form method="post" action="{{route('user.updatePassword')}}" class="clearfix">
     {{csrf_field()}}
       <div>
            <label>New Password</label>
            <input type="password" class="form-control" name="actual_password" id="actual_password" placeholder="">
        </div>
        <div>
            <label for="new_password">New Password</label>
            <input type="password" class="form-control" name="new_password" id="new_password" placeholder="">
        </div>
        <div>
            <label>Confirm password</label>
            <input type="password" name="new_password_confirm" class="form-control" id="new_password_confirm" placeholder="">
        </div>
        <div class="form-group">
            <input type="submit" value="Update password"/>
        </div>
    </form>

提交传递的Var转储:

array:3 [▼
  "actual_password" => "password"
  "new_password" => "passwordw"
  "new_password_confirm" => "passwordw"
]

2 个答案:

答案 0 :(得分:1)

您可能已在错误的地方确认:

$this->validate($request, [
        'actual_password' => 'required|string|min:6',
        'new_password' => 'required|string|min:6|confirmed',
        'new_password_confirmation' => 'required|string|min:6|same:new_password',
        ]);

修改:第二个字段必须以_confirmation结尾,而不是_confirm。这是内置要求。

请参阅laravel validation confirmed

答案 1 :(得分:0)

规则可以简化:

$this->validate($request, [
    'actual_password' => 'required|string|min:6',
    'new_password' => 'required|string|min:6|different:actual_password',
    'new_password_confirm' => 'same:new_password',
]);

一些注意事项:

  • actual_password:这些规则并不是必需的,因为您无论如何都必须检查旧密码与用户输入。实际上,如果您更改密码规则(例如min:10而不是min:6),它甚至可能成为未来的问题,因为这样您可能会遇到更改密码的麻烦(本来可能会有效但在代码更改后没有,所以你甚至不能改变它。)
  • new_password:添加了支票different:actual_password,以确保新密码与旧密码不同。对这个验证规则使用正则表达式也是有意义的,例如,强制使用不同类型的字符(小写和大写字母,数字和特殊字符)。
  • new_password_confirm:使用您建议的same:new_password规则绝对有效并且是一个很好的解决方案。就个人而言,我甚至发现Dimitri Mostry提到的魔法验证规则confirm有点危险,因为人们很可能无法理解未来的背景(即可维护性不好)。在后台,confirm方法与same:other_fieldsee here)完全相同。但是,所有其他验证规则都已过时。当您为new_password执行已经执行时,您必须强制性地强制它们用于确认字段,当它必须是相同的值时。