laravel重置密码自定义验证器?

时间:2017-08-10 20:26:01

标签: php laravel laravel-5 laravel-5.4

通过查看ResetsPasswords code我可以看到规则方法受到保护:

[dog, dog, fish]

如果我无法覆盖规则方法,那么在重置密码表单中添加另一个自定义验证的适当方法是什么?

我可以覆盖重置方法,但它太大了,如果在未来的版本中它们会改变一些逻辑,我会遇到麻烦,因为我不想用安全功能搞得太多

4 个答案:

答案 0 :(得分:2)

对于laravel 5.8:

在以上答案中,仅使用具有自定义规则功能的特征是不够的,因为在laravel \ framework \ src \ Illuminate \ Auth \ Passwords \ PasswordBroker.php文件中,它使用另一种验证方法来检查密码的长度。

因此,为了使用密码的自定义长度,请同时覆盖规则和密码代理的验证方法

创建一个存储密码长度的属性

/**
 * Minimum length required for password
 *
 * @var string
 */
protected $passwordLength = '6';

在app \ Http \ Controllers \ Auth \ ResetPasswordController.php中更改构造函数

/**
 * Create a new controller instance.
 *
 * @return void
 */
public function __construct()
{
    $this->middleware('guest');

    $this->broker()->validator(function (array $credentials)
    {
        [$password, $confirm] = [
            $credentials['password'],
            $credentials['password_confirmation'],
        ];

        return $password === $confirm && mb_strlen($password) >= $this->passwordLength;
    });
}

并通过自定义验证添加规则功能

/**
 * Get the password reset validation rules.
 *
 * @return array
 */
protected function rules()
{
    return [
        'token' => 'required',
        'email' => 'required|email',
        'password' => 'required|min:'.$this->passwordLength,
    ];
}

答案 1 :(得分:1)

Laravel在App\Http\Controllers\Auth;

中有一些基本的auth控制器

其中一个是ResetPasswordController控制器,即加载特征。

在此课程中,您只需覆盖rules()函数。

如果您不想更新rules()功能,则必须更新reset()功能以修改阵列。但我不建议这样做,因为这个函数比rules()函数更复杂,并且会明显改变。

如果要更新特征,可以像这样扩展:

trait CustomResetsPasswords {
    use ResetsPasswords;

    public function rules() {
        //return my custom rules
    }
}

然后在ResetPasswordController中使用您的CustomResetsPasswords特征。

答案 2 :(得分:0)

您可以覆盖reset特征中的ResetsPasswords方法。因此,它将自定义验证器添加到Broker实例,并绕过Laravel的废话默认验证规则。

/**
 * Reset the given user's password.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\RedirectResponse
 */
public function reset(Request $request)
{
    $this->validate($request, $this->rules(), $this->validationErrorMessages());

    // These two lines below allow you to bypass the default validation.
    $broker = $this->broker();
    $broker->validate(function () { return true; });

    $response->reset(
        $this->credentials($request), function ($user, $password) {
            $this->resetPassword($user, $password);
        }
    );

    return $response == Password::PASSWORD_RESET
                ? $this->sendResetResponse($response)
                : $this->sendResetFailedResponse($request, $response);
}

答案 3 :(得分:0)

对于 Laravel 5.8(我没有测试过更新的版本)

最简单的解决方案是覆盖ResetsPasswords Traits中的rules function

class ResetPasswordController extends Controller
{

    use ResetsPasswords;

   
    protected $redirectTo = '/home';

    public function __construct()
    {
        $this->middleware('guest');
    }

    // this function is ovverride from ResetsPasswords Traits
    protected function rules()
    {
        return [
            'token' => 'required',
            'email' => 'required|email',
            'password' => 'required|min:8|confirmed',
        ];
    }
}