laravel 5.1 Password :: reset返回passwords.password

时间:2015-11-07 00:37:13

标签: php laravel-5.1

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

知道如何解决这个问题吗?

4 个答案:

答案 0 :(得分:2)

你在寻找的是这堂课:

\Illuminate\Auth\Passwords\PasswordBroker

和这个功能

validatePasswordWithDefaults

在此函数中6被硬编码看起来有点奇怪。 我想改变它可能有更好的做法。 也许你可以在你的控制器中覆盖这个功能。试试这个。

答案 1 :(得分:2)

这是因为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;
});

答案 2 :(得分:1)

更改此行:

'password' => 'required|confirmed|digits:5'

'password' => 'required|confirmed|min:5'

答案 3 :(得分:0)

如果您想更改文本并覆盖password.password,请按照以下步骤操作

首先转到 PasswordBroker.php

vendor\laravel\framework\src\Illuminate\Contracts\Auth\PasswordBroker.php

转到第35行并在此处更改

const INVALID_PASSWORD =  '**any thing you want**';

或者如果您想更改验证,请按照以下步骤操作

首先转到 PasswordBroker.php

vendor\laravel\framework\src\Illuminate\Auth\Passwords\PasswordBroker.php

转到第176行并在此处更改

return $password === $confirm && mb_strlen($password) >= **any digit you want**;

然后转到 ResetsPasswords.php

vendor\laravel\framework\src\Illuminate\Foundation\Auth\ResetsPasswords.php

转到第69行并在此处更改

'password' => 'required|confirmed|min:**degit you chose in **PasswordBroker.php****',

谢谢...有效