2012-10-03 26 views
6

Estoy siguiendo http://symfony.com/doc/current/cookbook/security/voters.html y tratando de hacer un votante personalizado que deniega el acceso a las solicitudes que no contienen una clave API válida y resumen en el encabezado (influenciado por http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html - No estoy creando un proveedor de autenticación porque necesito use el proveedor FOSUserBundle para la misma solicitud).¿Cómo inyectar el proveedor de usuario en memoria en un servicio?

Me gustaría almacenar mis claves/secretos api en el proveedor de usuarios en memoria para comenzar y probablemente migrar esto a un proveedor mongodb personalizado en una fecha posterior. Entonces necesito una forma de inyectar al proveedor del usuario en mi votante. Ya he inyectado el contenedor de servicio, pero ¿se puede acceder a los proveedores de usuario desde allí?

Mi definición de servicio:

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 } 

Así que mi pregunta es, ¿Cómo me inyecto el proveedor dentro de la memoria? El ejemplo de WSSE en el libro de cocina parece utilizar una fábrica de proveedor de autenticación para reemplazar la cadena 'security.providers.in_memory', pero como solo estoy usando un votante, ¿es esto necesario? Si es necesario, ¿cómo se vería mi fábrica?

Respuesta

7

El proveedor de usuarios en memoria primero se define como un servicio abstracto en SecurityBundle security.xml. De acuerdo con la configuración de su proveedor de usuario en security.yml, SecurityBundle's SecurityExtension luego crea el servicio de proveedor de usuario concreto en memoria, al cual cada usuario se agrega como un servicio. Como puede ver, el nombre de este servicio será security.user.provider.concrete.[name-of-your-firewall]. Por lo tanto, debería ser posible utilizar este servicio o inyectar este servicio en su votante. Siempre puede echar un vistazo en el contenedor de servicio objeto de dumping en su directorio /app/cache para averiguar los nombres de los servicios y si están definidos en absoluto.

6

El nombre en memoria del proveedor de servicio de usuario es security.user.provider.concrete.in_memory pero el servicio es privado, por lo que necesita para definir un alias para ella en config.yml:

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

Ahora, se puede acceder a él como in_memory_user_provider.

+1

Ambas respuestas fueron similares así que he aceptado la primera, pero gracias por la información adicional sobre el uso de un alias. –

0

El servicio ya está declarada

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