我在控制器中有此功能,但我无法重置密码,因为我想将字符长度更改为 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);
它打印:
密码.密码
知道如何解决这个问题吗?
发生这种情况是因为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 个字符。
您可以使用 Password::validator
设置passwordValidator
,它接受必须返回一个布尔值的闭包,该值指示给定凭据是否有效。这需要在Password::reset
之前完成。
例如,将验证器更改为要求密码长度正好为 5 个字符将特别满足您的要求。
Password::validator(function($credentials)
{
return strlen($credentials['password']) === 5;
});
你要找的就是这个类:
'Illuminate'Auth'Passwords'PasswordBroker
和这个函数
validatePasswordWithDefaults
这看起来有点奇怪,6
在这个函数中是硬编码的。我想可能有更好的做法来改变这一点。也许您可以在控制器中覆盖该功能。也试试。
更改此行:
'password' => 'required|confirmed|digits:5'
自
'password' => 'required|confirmed|min:5'
如果您想更改文本并覆盖密码.password,请按照以下步骤操作
首先转到密码经纪人.php
vendor'laravel'framework'src'Illuminate'Contracts'Auth'PasswordBroker.php
转到第 35 行并在此处更改
const INVALID_PASSWORD = '**any thing you want**';
或者,如果您想更改验证,请按照以下步骤操作
首先转到密码经纪人.php
vendor'laravel'framework'src'Illuminate'Auth'Passwords'PasswordBroker.php
转到第 176 行并在此处更改
return $password === $confirm && mb_strlen($password) >= **any digit you want**;
然后去重置密码.php
vendor'laravel'framework'src'Illuminate'Foundation'Auth'ResetsPasswords.php
转到第 69 行并在此处更改
'password' => 'required|confirmed|min:**degit you chose in **PasswordBroker.php****',
谢谢。。。它有效