Symfony2 Security: использование настроек шифрования в коде

Я использую 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 в своем коде, чтобы сделать решение более обобщенным и удобным для внесения изменений?

1

Решение

Немного сложно вытащить что-то напрямую из security.yml, и вы действительно этого не хотите. Вы можете просто использовать тот же кодер пароля, который использует система безопасности.

$encoderFactory = $this->get('security.encoder_factory');

$encoder = $encoderFactory->getEncoder($user);

$passwordEncrypted = $encoder->encodePassword($passwordPlaintext,$user->getSalt());

Возможно, стоит взглянуть на класс FOSUserBundle UserManager. У него есть несколько полезных приемов.

1

Другие решения

Вы не должны вручную кодировать пароль внутри объекта. Лучше оставить сущность полностью независимой и просто передать закодированный результат setPassword(),

Однако вы все равно можете сделать это вручную вне объекта, например, в сервисе, и в этом случае лучше получить фабричную службу кодировщика паролей из контейнера (или даже лучше внедрить ее), чем пытаться воспроизвести алгоритм самостоятельно:

$encoder = $this->container->get('security.encoder_factory')->getEncoder($user);
$user->setPassword($encoder->encodePassword('p4ssw0rd', $user->getSalt()));

Кроме того, дополнительное преимущество использования Bcrypt заключается в том, что вы можете изменить стоимость в любое время, не беспокоясь об обновлении всех паролей в базе данных одновременно. Он по-прежнему сможет проверять пароли со старыми настройками, и вместо этого вы можете обновить пароль в базе данных, установив более строгие настройки безопасности при следующем входе в систему.

0

По вопросам рекламы [email protected]