通过查看ResetsPasswords code我可以看到规则方法受到保护:
[dog, dog, fish]
如果我无法覆盖规则方法,那么在重置密码表单中添加另一个自定义验证的适当方法是什么?
我可以覆盖重置方法,但它太大了,如果在未来的版本中它们会改变一些逻辑,我会遇到麻烦,因为我不想用安全功能搞得太多
答案 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;
其中一个是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',
];
}
}