Как подключить кодер паролей к пользовательскому интерфейсу в Silex?

Поэтому я пытаюсь создать новое приложение Silex и использовать комплект Security. Для простоты я собирался пойти с базовой кодировкой пароля.

В документации Silex http://silex.sensiolabs.org/doc/providers/security.html Я создал пользовательский поставщик. Однако этот пользовательский интерфейс, похоже, не использует кодировку пароля по умолчанию.

Я могу успешно получить пароль из

$password = $app['security.encoder.digest']->encodePassword('foo'); 

Однако, когда я использую пример

 // find the encoder for a UserInterface instance $encoder = $app['security.encoder_factory']->getEncoder($user); // compute the encoded password for foo $password = $encoder->encodePassword('foo', $user->getSalt()); 

Я получаю

RuntimeException: кодер не настроен для учетной записи

В symfony2 я бы использовал что-то вроде следующего

 encoders: somename: class: Acme\DemoBundle\Entity\User Acme\DemoBundle\Entity\User: sha512 Acme\DemoBundle\Entity\User: plaintext Acme\DemoBundle\Entity\User: algorithm: sha512 encode_as_base64: true iterations: 5000 Acme\DemoBundle\Entity\User: id: my.custom.encoder.service.id 

Но, похоже, это не так. Я не могу найти какой-либо тип метода setEncoder, поэтому я немного тупик.

Solutions Collecting From Web of "Как подключить кодер паролей к пользовательскому интерфейсу в Silex?"

Вам необходимо восстановить EncoderFactory чтобы добавить вашу собственную реализацию:

 <?php $app = new Silex\Application(); $app['myapp.encoder.base64'] = new Base64PasswordEncoder(); $app['security.encoder_factory'] = $app->share(function ($app) { return new EncoderFactory( array( 'Symfony\Component\Security\Core\User\UserInterface' => $app['security.encoder.digest'], 'MyApp\Model\UserInterface' => $app['myapp.encoder.base64'], ) ); }); 

(ах, пожалуйста, не используйте Base64Encoder () для пароля;))

Я смог использовать принятый ответ, чтобы исправить мою проблему, но я не мог напрямую назначить ее security.encoder_factory , поэтому я просто делюсь тем, что нашел для работы.

вместо:

 $app['security.encoder_factory'] = $app->share(function($app) { //..see above...// }); 

Мне пришлось использовать:

 $app->register(new Silex\Provider\SecurityServiceProvider(),array( 'security.encoder_factory' => $app->share(function($app) { //... same as above ...// }) )); 

Я слишком новичок в Силексе, чтобы понять, почему это не работает для меня выше. Мое первоначальное предположение было бы разницей в версии (вопрос был задан более двух лет назад). Я могу назначить security.provider.default перед вызовом для регистрации модуля, но я не могу присвоить security.encoder_factory . Мне также кажется, что нужно поставить security.firewalls в вызов регистра.