Как динамически выбирать алогоритм кодировщика пароля
Как динамически выбирать алогоритм кодировщика пароля
Обычно, для всех пользователей используется одинаковый кодировщик пароля, сконфигурированный так, чтобы быть применимым ко всем экземплярам конкретного класса:
1 2 3 4 5
# app/config/security.yml
security:
# ...
encoders:
Symfony\Component\Security\Core\User\User: sha512
Другой вариант - использовать "названный" кодировщик, а потом выбирать, какой кодировщик вы хотите использовать динамически.
В предыдущем примере, вы установили алогритм sha512
для Acme\UserBundle\Entity\User
.
Это может быть достаточно безопасно для обычного пользователя, но что, если вы хотите,
чтобы ваши администраторы имели более сильные алгоритмы, например, bcrypt
? Это можно
сделать с помощью названных кодировщиков:
1 2 3 4 5 6 7
# app/config/security.yml
security:
# ...
encoders:
harsh:
algorithm: bcrypt
cost: 15
Так создаётся кодировщик, названный harsh
. Для того, чтобы экземпляр User
использовал его, класс должен реализовывать
EncoderAwareInterface.
Интерфейс требует одного метода - getEncoderName()
- который должен возвращать
имя кодировщика, который нужно использовать:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
// src/Acme/UserBundle/Entity/User.php
namespace Acme\UserBundle\Entity;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\Encoder\EncoderAwareInterface;
class User implements UserInterface, EncoderAwareInterface
{
public function getEncoderName()
{
if ($this->isAdmin()) {
return 'harsh';
}
return null; // использовать кодировщик по умолчанию
}
}