Я использую security.yml для настройки шифрования пароля:
encoders:
Acme\UserBundle\Entity\User:
algorithm: bcrypt
cost: 10
Теперь я хочу обновить пароль пользователя в моем User Entity, чтобы где-то в Entity \ User.php у меня было что-то вроде:
$this->password = password_hash($password, PASSWORD_DEFAULT, ['cost' => 10]);
Но давайте представим, что иногда кто-то решит изменить, например, стоимость шифрования на 20, и обновит security.yml. Легко забыть о пользовательском коде шифрования.
Могу ли я использовать настройки из security.yml в своем коде, чтобы сделать решение более обобщенным и удобным для внесения изменений?
Немного сложно вытащить что-то напрямую из security.yml, и вы действительно этого не хотите. Вы можете просто использовать тот же кодер пароля, который использует система безопасности.
$encoderFactory = $this->get('security.encoder_factory');
$encoder = $encoderFactory->getEncoder($user);
$passwordEncrypted = $encoder->encodePassword($passwordPlaintext,$user->getSalt());
Возможно, стоит взглянуть на класс FOSUserBundle UserManager. У него есть несколько полезных приемов.
Вы не должны вручную кодировать пароль внутри объекта. Лучше оставить сущность полностью независимой и просто передать закодированный результат setPassword()
,
Однако вы все равно можете сделать это вручную вне объекта, например, в сервисе, и в этом случае лучше получить фабричную службу кодировщика паролей из контейнера (или даже лучше внедрить ее), чем пытаться воспроизвести алгоритм самостоятельно:
$encoder = $this->container->get('security.encoder_factory')->getEncoder($user);
$user->setPassword($encoder->encodePassword('p4ssw0rd', $user->getSalt()));
Кроме того, дополнительное преимущество использования Bcrypt заключается в том, что вы можете изменить стоимость в любое время, не беспокоясь об обновлении всех паролей в базе данных одновременно. Он по-прежнему сможет проверять пароли со старыми настройками, и вместо этого вы можете обновить пароль в базе данных, установив более строгие настройки безопасности при следующем входе в систему.