如何从Symfony2中的服务获取用户对象

时间:2011-06-17 15:36:34

标签: symfony

我的网站正在使用第三方服务进行身份验证以及其他功能,因此我设置了一项服务,为我执行所有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 个答案:

答案 0 :(得分:1)

security.context服务的责任太多了。这就是它在Symfony 2.6中被弃用并且两个新服务取而代之的原因; security.token_storagesecurity.authorization_checker。更新可能会解决您的一些麻烦。

在此处阅读更多内容:http://symfony.com/blog/new-in-symfony-2-6-security-component-improvements

并且aslo:为什么用户提供者需要安全上下文? UserProvider只应按用户名加载用户。没有更多...在这里阅读有关自定义用户提供商的更多信息:http://symfony.com/doc/current/cookbook/security/custom_provider.html

答案 1 :(得分:0)

我找到了一个临时的解决方法,但它并不是非常犹太。您可以将整个@service_container注入您的服务,并仅使用security.context。但是,您必须将整个容器设置为类属性。如果你只在构造函数中使用安全上下文,它仍然会抛出循环引用异常。