Вручную ha sh (т.е. кодировать) строковое значение в Symfony 3.4 - PullRequest
0 голосов
/ 29 апреля 2020

Есть ли способ в Symfony 3.4 использовать кодировщик паролей без сущности, которая реализует UserInterface?


Подробности

Я хочу ха sh случайное строковое значение в Symfony 3.4. Я всегда могу использовать password_hash, но я пытаюсь сделать это Symfony и использовать преимущества фреймворка. Вот где я застреваю:

Документация Symfony имеет пример, но он использует UserPasswordEncoder, который предполагает, что у вас есть объект, реализующий UserInterface для передачи в качестве первый аргумент encodePassword($user, $plainPassword).

В этом случае у меня нет пользовательской сущности, потому что я генерирую токен для ссылки электронной почты. У меня есть сущность, но я чувствую себя неправильно, если она реализует UserInterface, когда это не пользователь.

Я покопался в коде для UserPasswordEncoder и подумал, что могу просто внедрить PasswordEncoderInterface, который имеет универсальный c encodePassword($plainPassword, $salt) метод, но я получаю это исключение при попытке его автоматического подключения:

Cannot autowire service "SriBundle\Service\PubMatch\PublicationMatchLogService":
argument "$passwordEncoder" of method "__construct()" references interface
"Symfony\Component\Security\Core\Encoder\PasswordEncoderInterface" but no such service exists.
It cannot be auto-registered because it is from a different root namespace.

Кажется, Symfony не имеет службы по умолчанию, которая реализует PasswordEncoder и может быть автоматически подключенным Я что-то здесь упускаю, или Symfony предполагает, что вы хотите иметь только sh пароли для пользовательских сущностей и не поддерживает кодирование ха sh для случайного строкового значения без передачи в связанный пользователь?

1 Ответ

2 голосов
/ 29 апреля 2020

Служба реализации PasswordEncoderInterface не определена по умолчанию в Symfony. Они используются внутренне с UserPasswordEncoderInterface.

Я нашел это благодаря команде debug: container.

Но вы можете легко определить их самостоятельно! Вот пример использования SodiumPasswordEncoder в файле config / services.yaml:

services:

    # ... Your other definitions

    # Define an alias to allow autowiring on the interface
    Symfony\Component\Security\Core\Encoder\PasswordEncoderInterface: '@password_encoder.sodium'

    # Define the concrete service
    # You can add the arguments entry if needed
    password_encoder.sodium:
        class: Symfony\Component\Security\Core\Encoder\SodiumPasswordEncoder
...