Symfony Validator - 在散列之前检查密码长度和内容
Symfony Validator - Check password length and content BEFORE hashing
我创建了一个密码验证,但是当我插入一个新用户时,这个验证是在加密密码后触发的...
我正在使用 Argon2Id,因此密码将超过 30 个字符...
我的验证器(config/validator/validation.yaml):
App\Entity\Utilisateur:
properties:
mdp:
- Length:
min: 6
max: 30
minMessage: 'Votre mot de passe doit faire au moins {{ limit }} caractères'
maxMessage: 'Votre mot de passe doit faire moins de {{ limit }} caractères'
Utilisateur.php 中的 setMdp:
public function setMdp(string $mdp): self
{
$this->mdp = password_hash($mdp, PASSWORD_ARGON2ID);
return $this;
}
所以,当我插入新用户时,Symfony 验证器告诉我密码超过 30 个字符时出现错误。
如何在加密我的密码之前触发此验证器?
谢谢!
你的做法不对!你应该让 set 方法保持原样:
public function setMdp(string $mdp): self
{
$this->mdp = $mdp;
return $this;
}
相反,您可以在控制器中验证表单后对密码进行编码,如下所示:
public function createAccount(Request $request, UserPasswordEncoderInterface $passwordEncoder) {
...
$createAccountForm = $this->createForm(CreateAccountFormType::class);
$createAccountForm->handleRequest($request);
if ($createAccountForm->isSubmitted() && $createAccountForm->isValid()) {
$user = $createAccountForm->getData();
$user->setPassword($passwordEncoder->encodePassword($user, $user->getPlainPassword()));
// flush, persist and other changes
}
}
但是,正如您在我的示例中看到的那样,我正在对 $user->getPlainPassword()
进行编码,其中一个 getter 用于未映射(到学说)实体 属性,这是唯一的工作为此 属性.
我创建了一个密码验证,但是当我插入一个新用户时,这个验证是在加密密码后触发的...
我正在使用 Argon2Id,因此密码将超过 30 个字符...
我的验证器(config/validator/validation.yaml):
App\Entity\Utilisateur:
properties:
mdp:
- Length:
min: 6
max: 30
minMessage: 'Votre mot de passe doit faire au moins {{ limit }} caractères'
maxMessage: 'Votre mot de passe doit faire moins de {{ limit }} caractères'
Utilisateur.php 中的 setMdp:
public function setMdp(string $mdp): self
{
$this->mdp = password_hash($mdp, PASSWORD_ARGON2ID);
return $this;
}
所以,当我插入新用户时,Symfony 验证器告诉我密码超过 30 个字符时出现错误。
如何在加密我的密码之前触发此验证器?
谢谢!
你的做法不对!你应该让 set 方法保持原样:
public function setMdp(string $mdp): self
{
$this->mdp = $mdp;
return $this;
}
相反,您可以在控制器中验证表单后对密码进行编码,如下所示:
public function createAccount(Request $request, UserPasswordEncoderInterface $passwordEncoder) {
...
$createAccountForm = $this->createForm(CreateAccountFormType::class);
$createAccountForm->handleRequest($request);
if ($createAccountForm->isSubmitted() && $createAccountForm->isValid()) {
$user = $createAccountForm->getData();
$user->setPassword($passwordEncoder->encodePassword($user, $user->getPlainPassword()));
// flush, persist and other changes
}
}
但是,正如您在我的示例中看到的那样,我正在对 $user->getPlainPassword()
进行编码,其中一个 getter 用于未映射(到学说)实体 属性,这是唯一的工作为此 属性.