Поэтому я пытаюсь создать новое приложение 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, поэтому я немного тупик.
Вам необходимо восстановить 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
в вызов регистра.