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 回答
0

该服务已声明

<service id="security.user.provider.in_memory" class="Symfony\Component\Security\Core\User\InMemoryUserProvider" abstract="true" />
于 2017-06-27T07:32:32.773 回答