7

私は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' を置き換えているようですが、投票者を使用しているだけなので、これは必要ですか? もし必要なら、私の工場はどのようになりますか?

4

3 に答える 3

8

インメモリ ユーザー プロバイダは、最初に SecurityBundle のsecurity.xmlで抽象サービスとして定義されます。でのユーザー プロバイダーの構成に基づいてsecurity.yml、SecurityBundle のSecurityExtensionは具体的なメモリ内ユーザー プロバイダー サービスを作成し、そこに各ユーザーがサービスとして追加されます。ご覧のとおり、このサービスの名前は になりますsecurity.user.provider.concrete.[name-of-your-firewall]。したがって、このサービスを投票者に使用したり、このサービスを注入したりできるはずです。ディレクトリ内のダンプされたサービス コンテナーをいつでも調べて、/app/cacheサービスの名前と、サービスが定義されているかどうかを確認できます。

于 2012-10-03T19:08:36.500 に答える
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

于 2012-10-04T06:42:04.367 に答える