laravel 5.1 密码::reset 返回密码.密码.


laravel 5.1 Password::reset returns passwords.password

我在控制器中有此功能,但我无法重置密码,因为我想将字符长度更改为 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****',

谢谢。。。它有效