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 用于未映射(到学说)实体 属性,这是唯一的工作为此 属性.