2012-10-03 43 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 key/secrets存儲在內存中的用戶提供程序中,並可能在稍後將其遷移到自定義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 } 

所以我的問題是,我怎麼注入內存供應商? Cookbook中的WSSE示例似乎使用auth提供程序工廠來替換字符串'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" /> 
相關問題