我使用security.yml配置密码加密:
encoders:
Acme\UserBundle\Entity\User:
algorithm: bcrypt
cost: 10
现在我想在我的用户实体中更新用户密码,所以在Entity \ User.php的某处我应该有类似的东西:
$this->password = password_hash($password, PASSWORD_DEFAULT, ['cost' => 10]);
但是,让我们想象有时会有人决定将加密成本值更改为20并更新security.yml。很容易忘记自定义加密代码。
我可以在我的代码中使用security.yml中的设置来使解决方案更加通用且更友好吗?
答案 0 :(得分:1)
直接从security.yml中删除东西有点挑战,你真的不想这样做。您可以使用安全系统使用的相同密码编码器。
$encoderFactory = $this->get('security.encoder_factory');
$encoder = $encoderFactory->getEncoder($user);
$passwordEncrypted = $encoder->encodePassword($passwordPlaintext,$user->getSalt());
可以考虑查看FOSUserBundle UserManager类。它有一些有用的技术。
答案 1 :(得分:0)
您不应在实体内手动编码密码。更好的方法是让实体完全不可知,并将编码结果传递给setPassword()
。
然而,您仍然可以在实体外部手动执行此操作,例如在服务中,并且在这种情况下,最好从容器中获取密码编码器工厂服务(或者更好地注入它),而不是尝试重现算法你自己:
$encoder = $this->container->get('security.encoder_factory')->getEncoder($user);
$user->setPassword($encoder->encodePassword('p4ssw0rd', $user->getSalt()));
此外,使用Bcrypt的另一个好处是您可以随时更改成本,而无需担心同时更新数据库中的所有密码。它仍然可以使用旧设置检查密码,例如,您可以在下次登录时使用更强的安全设置更新数据库中的密码。