我使用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中的设置来使解决方案更通用,对更改更友好吗?
发布于 2015-01-09 20:01:18
直接从security.yml中提取东西有点挑战,而且你真的不想这样做。您可以使用与安全系统相同的密码编码器。
$encoderFactory = $this->get('security.encoder_factory');
$encoder = $encoderFactory->getEncoder($user);
$passwordEncrypted = $encoder->encodePassword($passwordPlaintext,$user->getSalt());可以考虑看看FOSUserBundle UserManager类。它有一些有用的技术。
发布于 2015-01-09 20:21:40
不应在实体内手动编码密码。更好的做法是让实体完全不可知,只将编码后的结果传递给setPassword()。
但是,您仍然可以在实体外手动执行此操作,例如在服务中,在这种情况下,最好从容器中获取密码编码器工厂服务(或者更好地注入它),而不是尝试自己重现算法:
$encoder = $this->container->get('security.encoder_factory')->getEncoder($user);
$user->setPassword($encoder->encodePassword('p4ssw0rd', $user->getSalt()));此外,使用Bcrypt的另一个好处是,您可以随时更改成本,而无需担心同时更新数据库中的所有密码。它仍然能够使用旧设置检查密码,例如,您可以在下次登录时使用更强的安全设置来更新数据库中的密码。
https://stackoverflow.com/questions/27859259
复制相似问题