我尝试过,@Assert\MinLength
但它似乎在对密码进行编码后进行检查,因为它在任何情况下都足够长。如何在编码之前放置约束?
我想不出比strlen
在绑定注册表后计算符号数量更好的方法,但我认为这不是一个好方法。而且我也不确定这是否会起作用,我不确定编码何时完成。
任何建议将不胜感激!先感谢您!
问题是您将一个字段用于两个目的:以纯文本和编码形式存储密码。您需要的是每个目的的字段:
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\MinLength;
use Doctrine\ORM\Mapping\Column;
class User
{
/**
* @NotBlank
* @MinLength(6)
*
* @var string
*/
private $plainPassword;
/**
* @Column
*
* @var string
*/
private $password;
}
只有该$password
字段被持久化到数据库中,并且它不会显示在表单中,因此用户无法对其进行编辑。
你还需要一个 Doctrine 事件监听器——或者其他一些代码——来检查它$plainPassword
是否不为空,如果不为空,则编码它的值并将其放入$password
.
使用该security.encoder_factory
服务获取您在安全配置中设置的编码器,并使用它对密码进行编码。另外,检查我的ElnurBlowfishPasswordEncoderBundle。
您不应该在密码设置器中自己编码密码。取而代之的是使用一些编码器(您甚至可以编写自己的编码器),并在验证表单后对密码进行编码。
以下是如何使用编码器的示例:
http://symfony.com/doc/current/book/security.html#encoding-the-user-s-password