Как динамически выбирать алогоритм кодировщика пароля

Как динамически выбирать алогоритм кодировщика пароля

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

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; // использовать кодировщик по умолчанию
    }
}