2012-10-03 5 views
6

http://symfony.com/doc/current/cookbook/security/voters.html10 takip ediyorum ve geçerli bir API anahtarı içermeyen ve başlıkta sindirme (http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html etkilenen istekleri için erişimi reddeden özel bir seçmen yapmaya çalışıyorum) - bir kimlik doğrulama sağlayıcısı oluşturmuyorum çünkü aynı istek için FOSUserBundle sağlayıcısını kullanın).Bellek içi kullanıcı sağlayıcı bir servise nasıl enjekte edilir?

Api anahtarlarını/sırlarımı bellek içi kullanıcı sağlayıcısında saklamak ve muhtemelen daha sonraki bir tarihte özel bir mongodb sağlayıcısına taşımak istiyorum. Bu yüzden kullanıcı sağlayıcıyı seçmenime enjekte etmenin bir yoluna ihtiyacım var. Hizmet kabını zaten enjekte ettim, ancak kullanıcı sağlayıcılara buradan erişilebiliyor mu?

hizmetim tanımı:
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 } 

Benim soru, nasıl bellek sağlayıcı enjekte mı olduğunu

? Yemek kitabındaki WSSE örneği, 'security.providers.in_memory' dizesini değiştirmek için bir yetkili sağlayıcı fabrikası kullanıyor gibi görünüyor, ancak sadece bir seçmen kullanıyorum, bu gerekli mi? Gerekirse, fabrikam nasıl görünecek?

cevap

7

Bellek içi kullanıcı sağlayıcı, ilk olarak SecurityBundle'ın security.xml ürününde soyut bir hizmet olarak tanımlanır. Kullanıcı sağlayıcınızın security.yml'daki yapılandırmasına bağlı olarak, SecurityBundle'ın SecurityExtension, her bir kullanıcının bir hizmet olarak eklendiği somut bellek içi kullanıcı sağlayıcı hizmetini oluşturur. Gördüğünüz gibi, bu hizmetin adı security.user.provider.concrete.[name-of-your-firewall] olacaktır. Yani bu hizmeti bu serviste kullanmak veya seçmeninize enjekte etmek mümkün olmalıdır. Servislerin isimlerini öğrenmek ve hiç tanınmadıysanız, /app/cache dizininizdeki damperli hizmet kapsayıcısına her zaman bakabilirsiniz.

6

bellek içi kullanıcı sağlayıcı hizmetinin adı security.user.provider.concrete.in_memory olduğunu ama servis özel, yani config.yml bunun için bir takma ad tanımlamak gerekir: Şimdi

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

, sen in_memory_user_provider olarak erişebilirsiniz.

+1

Hem cevapları bu yüzden ilkini kabul ettik benzerdi ilan, ancak bir takma ad kullanarak ekstra bilgi için teşekkürler. –

0

Hizmet zaten

<service id="security.user.provider.in_memory" class="Symfony\Component\Security\Core\User\InMemoryUserProvider" abstract="true" />