2011-06-17 5 views
7

私のサイトは他の機能と同様に認証にサードパーティのサービスを使用していますので、私はすべてのAPI呼び出しを行うサービスを設定しています。ユーザーオブジェクトにアクセスする必要があることを確認します。 私のAPIサービスにsecurity.contextサービスを注入しようとしましたが、私のユーザー認証プロバイダがAPIサービスを参照しているため(ServiceCircularReferenceExceptionが発生します)、ユーザーを認証するために必要です。 だから、私はユーザーオブジェクトを取得する別の方法でこれに苦労していると私はこのチェーンを分割する任意の明白な方法を参照することはできませんsymfony2のサービスからユーザオブジェクトを取得するにはどうすればいいですか

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

のチェーンを取得します。

私のconfigsはすべてここに、config.ymlで定義されているが、関連するビットはmyapp.user_providerは私があると推測security.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" 

ですどのようにそれがsecurity.contextによって参照されているか

+1

services.xmlやservices.yml、あるいはconfig.ymlでカスタムサービスをどのように定義していますか?あなたの設定を見ることが役立ちます。 – markymark

+0

私の事例を更新して、私の問題を少し説明しました。あなたはアイデアを持っていますか?あるいは、ユーザーがsecurity.context経由で他のログインしているかどうかを確認する別の方法を知っていますか? – pogo

答えて

0

私は一時的な回避策を見つけましたが、あまりコーシャーではありません。あなたは@service_containerの全部をあなたのサービスに注入し、それからちょうどsecurity.contextを使うことができます。ただし、コンテナ全体をクラスプロパティとして設定する必要があります。コンストラクタでセキュリティコンテキストを取得するだけで、循環参照例外がスローされます。

1

security.contextサービスの責任は多すぎます。このため、Symfony 2.6では非推奨となり、2つの新しいサービスが導入されました。 security.token_storageおよびsecurity.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

関連する問題