我在控制器中有这个函数,我不能重置密码,因为我想将字符长度更改为5位数字。
public function postReset(Request $request)
{
$this->validate($request, [
'token' => 'required',
'password' => 'required|confirmed|digits:5',
]);
$credentials = $request->only(
'email', 'password', 'password_confirmation', 'token'
);
$response = Password::reset($credentials, function ($user, $password) {
$this->resetPassword($user, $password);
});
dd($response);
switch ($response) {
case Password::PASSWORD_RESET:
return redirect($this->redirectPath());
default:
return redirect()->back()
->withInput($request->only('email'))
->withErrors(['email' => trans($response)]);
}
}
protected function resetPassword($user, $password)
{
$user->password = bcrypt($password);
$user->save();
Auth::login($user);
}但它总是说:
哇哦!你的输入有一些问题。
密码必须至少有六个字符,并与确认相符。
当我说:
dd($response);它打印:
passwords.password
知道怎么解决这个问题吗?
发布于 2017-08-29 07:02:25
之所以会出现这种情况,是因为Illuminate\Auth\Passwords\PasswordBroker中存在硬编码验证。
当调用reset方法时,它总是先调用validateReset,然后调用validateNewPassword
public function validateNewPassword(array $credentials)
{
list($password, $confirm) = [
$credentials['password'],
$credentials['password_confirmation'],
];
if (isset($this->passwordValidator)) {
return call_user_func(
$this->passwordValidator, $credentials) && $password === $confirm;
}
return $this->validatePasswordWithDefaults($credentials);
}默认情况下,没有设置passwordValidator。因此validatePasswordWithDefaults将要求密码至少有6个字符长。
可以使用passwordValidator设置Password::validator,后者接受必须返回指示给定凭据是否有效的布尔值的闭包。这需要在Password::reset之前完成。
例如,更改验证器以要求密码精确为5个字符的长度将特别满足您的要求。
Password::validator(function($credentials)
{
return strlen($credentials['password']) === 5;
});发布于 2015-11-09 15:11:16
你要找的是这门课:
\Illuminate\Auth\Passwords\PasswordBroker而这个功能
validatePasswordWithDefaults这看起来有点奇怪,因为6是在这个函数中硬编码的。我想也许有更好的做法来改变这种状况。也许你可以在你的控制器里超越这个功能。那也试试吧。
发布于 2015-11-09 01:11:30
更改这一行:
'password' => 'required|confirmed|digits:5'至
'password' => 'required|confirmed|min:5'https://stackoverflow.com/questions/33577760
复制相似问题