2012-10-03 20 views
6

私はhttp://symfony.com/doc/current/cookbook/security/voters.htmlをフォローしており、有効なAPIキーとダイジェストを含まないリクエストのアクセスを拒否するカスタム投票者を作成しようとしています(http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.htmlの影響を受けます - 私は認証プロバイダを構築していません同じ要求に対してFOSUserBundleプロバイダを使用してください)。インメモリユーザプロバイダをサービスに挿入するにはどうすればよいですか?

メモリ内のユーザープロバイダに自分のapiキー/秘密を保存しておき、これを後でカスタムmongodbプロバイダに移行する可能性があります。だから私はユーザーのプロバイダを私の有権者に注入する方法が必要です。私はすでにサービスコンテナを注入しましたが、ユーザプロバイダはそこからアクセスできますか?

マイサービス定義:

services: 
    security.access.api_client_voter: 
     class:  Acme\RestBundle\Security\Authorization\Voter\ApiClientVoter 
     arguments: [@service_container, %kernel.cache_dir%/security/nonces] 
     public: false 
     tags: 
      - { name: monolog.logger, channel: authentication } 
      - { name: security.voter } 

だから私の質問は、私は、インメモリ・プロバイダーを注入しないか、でしょうか?調理冊子のWSSEの例は、 'security.providers.in_memory'という文字列を置換するための認証プロバイダファクトリを使用しているようですが、私は投票者を使用しているので、これは必要ですか?必要な場合、私の工場はどのように見えますか?

答えて

7

メモリ内ユーザプロバイダは、SecurityBundleのsecurity.xmlで抽象サービスとして最初に定義されます。 security.ymlのユーザプロバイダの設定に基づいて、SecurityBundleのSecurityExtensionは、各ユーザがサービスとして追加される具体的なメモリ内ユーザプロバイダサービスを作成します。ご覧のとおり、このサービスの名前はsecurity.user.provider.concrete.[name-of-your-firewall]になります。だから、このサービスをあなたの有権者に使うか、このサービスをあなたの有権者に注入することが可能でなければなりません。 /app/cacheディレクトリにあるダンプされたサービスコンテナを調べて、サービスの名前を調べることができます。

6

ザ・メモリー内のユーザーのプロバイダサービスの名前はsecurity.user.provider.concrete.in_memoryですが、サービスはプライベートなので、あなたがconfig.ymlでのエイリアスを定義する必要があります。

services: 
    in_memory_user_provider: 
     alias: security.user.provider.concrete.in_memory 

、あなたはin_memory_user_providerとしてそれにアクセスすることができます。

+1

両方の回答を宣言されているので、私は最初のものを受け入れてきた類似していたが、エイリアスを使用して上の余分な情報をお寄せいただきありがとうございます。 –

0

サービスがすでに

<service id="security.user.provider.in_memory" class="Symfony\Component\Security\Core\User\InMemoryUserProvider" abstract="true" /> 
関連する問題