Как я могу получить объект пользователя из сервиса в Symfony2 - PullRequest
7 голосов
/ 17 июня 2011

Мой сайт использует стороннюю службу для аутентификации, а также другие функциональные возможности, поэтому я настроил службу, которая выполняет все вызовы API для меня, и именно эта служба мне нужна для доступа к объекту пользователя.Я попытался внедрить службу security.context в мою службу API, но я получил ServiceCircularReferenceException, потому что мой поставщик аутентификации пользователя ссылается на службу API (это необходимо для аутентификации пользователя).Таким образом, я получаю цепочку

security.context -> authentication provider -> 
user provider -> API service -> security.context

Я борюсь с этим другим способом получения пользовательского объекта, и я не вижу никакого очевидного способа расщепления этой цепочки.

Мои конфиги все определены в config.yml, вот соответствующие биты

myapp.database:
    class: Pogo\MyAppBundle\Service\DatabaseService
    arguments:
        siteid: %siteid%
        entityManager: "@doctrine.orm.entity_manager"
myapp.apiservice:
    class: Pogo\MyAppBundle\Service\TicketingService
    arguments:
        entityManager: "@myapp.database"
myapp.user_provider:
    class: Pogo\MyAppBundle\Service\APIUserProvider
    arguments:
        entityManager: "@myapp.database"
        ticketingAdapter: "@myapp.apiservice"
        securityContext: "@security.context"
myapp.authenticationprovider:
    class: Pogo\MyAppBundle\Service\APIAuthenticationProvider
    arguments:
        userChecker: "@security.user_checker"
        encoderFactory: "@security.encoder_factory"
        userProvider: "@myapp.user_provider"

myapp.user_provider - это служба, которую я определил как службу моего провайдера в security.yml, и я предполагаю, чтона который ссылается security.context

Ответы [ 2 ]

1 голос
/ 29 декабря 2014

У службы security.context слишком много обязанностей. Вот почему в Symfony 2.6 это устарело, и на его месте появились две новые службы; security.token_storage и security.authorization_checker. Обновление может решить некоторые ваши головные боли.

Подробнее здесь: http://symfony.com/blog/new-in-symfony-2-6-security-component-improvements

И также: зачем поставщику пользователей нужен контекст безопасности? UserProvider должен загружать пользователя только по его имени. Ничего больше ... Узнайте больше о пользовательских провайдерах здесь: http://symfony.com/doc/current/cookbook/security/custom_provider.html

0 голосов
/ 15 октября 2011

Я нашел временный обходной путь, но он не очень кошерный. Вы можете ввести целую @service_container в свой сервис и использовать только security.context из него. Однако вы должны установить весь контейнер как свойство класса. Если вы возьмете только контекст безопасности в конструкторе, он все равно выдаст исключение циклической ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...