Доступ к службам безопасности в Sulu Frontend: хеширование пароля пользователя

Я пытаюсь зарегистрировать пользователя для интерфейса Sulu CMF. Я хочу хешировать пароли. Но по какой-то причине я не могу получить услугу.

You have requested a non-existent service "security.encoder_factory".

Or

You have requested a non-existent service "security.password_encoder"

если я попрошу

app/console container:debug | grep encode

Оба сервиса есть

$ app/console container:debug | grep encode                    
263: security.encoder_factory                                                      Symfony\Component\Security\Core\Encoder\EncoderFactory                                     
266: security.password_encoder                                                     Symfony\Component\Security\Core\Encoder\UserPasswordEncoder                                

У тебя есть какой-нибудь совет для меня? Мой контроллер знает о контейнере, и мой код выглядит следующим образом:

$this->container->get('security.password_encoder')

Вот некоторый вывод из conainer:debug

$ app/console container:debug security.password_encoder
[container] Information for service security.password_encoder
Service Id       security.password_encoder
Class            Symfony\Component\Security\Core\Encoder\UserPasswordEncoder
Tags             -
Scope            container
Public           yes
Synthetic        no
Lazy             no
Synchronized     no
Abstract         no


$ app/console container:debug security.encoder_factory 
[container] Information for service security.encoder_factory
Service Id       security.encoder_factory
Class            Symfony\Component\Security\Core\Encoder\EncoderFactory
Tags             -
Scope            container
Public           yes
Synthetic        no
Lazy             no
Synchronized     no
Abstract         no

На данный момент у меня установлена ​​версия symfony v2.6.12.

команда, предоставляемая sulu, использует этот метод. Он работает в обеих средах, dev и prod.

/**
 * Encodes the given password, for the given password, with he given salt and returns the result.
 *
 * @param $user
 * @param $password
 * @param $salt
 *
 * @return mixed
 */
private function encodePassword($user, $password, $salt)
{
    /** @var PasswordEncoderInterface $encoder */
    $encoder = $this->getContainer()->get('security.encoder_factory')->getEncoder($user);

    return $encoder->encodePassword($password, $salt);
}

person Patrick    schedule 11.01.2016    source источник
comment
Я звоню с диспетчера. Есть я, который расширяет Symfony\Bundle\FrameworkBundle\Controller\Controller (который расширяет ContainerAware).   -  person Patrick    schedule 11.01.2016
comment
Какую версию Symfony вы используете? И не могли бы вы показать вывод php app/console container:debug security.password_encoder и php app/console container:debug security.encoder_factory?   -  person xabbuh    schedule 11.01.2016
comment
Спасибо за Ваш ответ. Я добавил больше деталей выше.   -  person Patrick    schedule 11.01.2016
comment
Отличается ли вывод при использовании опции --env=prod?   -  person xabbuh    schedule 11.01.2016
comment
[LogicException] Отладочная информация о контейнере доступна только в режиме отладки. Как я могу проверить, нахожусь ли я в режиме отладки?   -  person Patrick    schedule 11.01.2016
comment
Может быть проще просто создать простую команду, которая использует одну из этих служб, а затем выполнить ее как в среде dev, так и в среде prod. Можете ли вы сделать это, чтобы убедиться, что ваша проблема не связана с окружающей средой?   -  person xabbuh    schedule 11.01.2016
comment
Бот app/console sulu:security:user:create --env=dev и app/console sulu:security:user:create --env=prod работает, как и ожидалось. Я добавил метод, используемый для генерации пароля в моем вопросе выше.   -  person Patrick    schedule 11.01.2016
comment
Вы уверены, что CLI и веб-интерфейсные контроллеры на самом деле используют одно и то же ядро?   -  person xabbuh    schedule 11.01.2016
comment
Ты прав. Sulu CMF имеет дополнительное консольное приложение, называемое app/console webconsole, которое использует другое ядро ​​:-)   -  person Patrick    schedule 11.01.2016
comment
Итак, теперь сервис недоступен, и я знаю, почему :-) Это большой шаг в правильном направлении. Большое спасибо.   -  person Patrick    schedule 11.01.2016
comment
Это полезный вопрос с хорошими ответами, но заголовок не так уж полезен — на самом деле речь идет не о хешировании пароля, а о получении доступа к службам безопасности в Сулу. Есть ли шанс, что вы могли бы изменить его?   -  person frumious    schedule 09.10.2016


Ответы (2)


Как xabbuh уже указал в комментариях, у нас есть два разных ядра в Sulu. Если вы используете команду app/webconsole, вы используете ядро ​​для веб-сайта.

В стандартной установке мы не включаем SecurityBundle, потому что это увеличивает нагрузку и не требуется для простых веб-сайтов. Однако, если вы создаете более сложное приложение, вы также можете защитить свой веб-сайт. В этом случае вы можете просто добавить новый экземпляр Symfony\Bundle\SecurityBundle\SecurityBundle в массив $bundles в app/WebsiteKernel. После этого также будет доступна услуга, о которой вы просили.

person Daniel Rotter    schedule 13.01.2016

Sulu CMF имеет дополнительное консольное приложение, называемое app/console webconsole, которое использует другое ядро ​​:-)

Сервис, который я искал, там не существует. Вместо этого я смог использовать

$userManager = $this->container->get('sulu_security.user_manager');
person Patrick    schedule 11.01.2016
comment
Это возможное решение, в зависимости от того, что вы хотите сделать. Добавит еще один ответ, чтобы добиться того, о чем вы действительно просили. - person Daniel Rotter; 13.01.2016
comment
Спасибо за ответ вам (всем). А уже выполнил свою задачу сейчас. Моя проблема заключалась в том, что я не видел, что у SULU разные ядра :-) - person Patrick; 13.01.2016