2012-01-31 10 views
28

que tienen dos servidores de seguridad:Autenticar cortafuegos múltiples Symfony2 con forma de un inicio de sesión

  1. api (para llamadas API)
  2. main (para todo lo demás)

Mi entrada aplicación cliente pasa a través de la main firewall. Sin embargo, sí interactúa con los puntos finales bajo el firewall api para obtener datos. El problema aquí es que no quiero obligar al usuario a iniciar sesión por segunda vez para autenticarse contra el segundo firewall.

¿Cómo puedo autenticarme contra ambos servidores de seguridad con un solo formulario de inicio de sesión?

Respuesta

59

Quizás podría probar la propiedad de firewall 'context'.

Digamos que tiene un algo de configuración como esta (que presumiblemente lo hace):

security: 
    // providers etc ... 

    firewall: 
     main: 
      pattern: # ... 
      provider: my_users 
      http_basic: ~ 
     api: 
      pattern: # ... 
      provider: my_users 
      http_basic: ~ 

En este caso, la sesión del usuario contendrá una propiedad '_security_main' después de autenticar contra el servidor de seguridad 'principal', y luego cuando intenten acceder a una ubicación 'api', se les pedirá que vuelvan a realizar la autenticación y luego obtendrán una propiedad de sesión '_security_api'.

Para evitar que esta re-solicitud, puede añadir la propiedad 'contexto' a cada definición de servidor de seguridad que desea compartir la misma autenticación - así:

security: 
    # providers etc ... 

    firewall: 
     main: 
      pattern: # ... 
      provider: my_users 
      http_basic: ~ 
      context: primary_auth # new 
     api: 
      pattern: # ... 
      provider: my_users 
      http_basic: ~ 
      context: primary_auth # new 

En este caso, después de la autenticación con el 'principal La propiedad 'firewall, a' _security_primary_auth 'se establecerá en la sesión del usuario. Cualquier solicitud posterior dentro del firewill 'api' usará entonces el valor de '_security_primary_auth' para establecer el estado de autenticación (y, por lo tanto, el usuario aparecerá autenticado).

Por supuesto, este intercambio de contexto de autenticación funcionará en ambos sentidos (ya sea que se autentiquen primero con el firewall 'principal' o 'api'); si solo desea transitoriedad en una dirección, las cosas serían más complejas.

Espero que esto ayude.

+1

brilliant! Funciona de maravilla. – anushr

+1

¡Bien, estaba buscando esto por mucho tiempo! – PMoubed

+1

Tengo exactamente el mismo problema, la única diferencia es que el firewall "principal" se autentica utilizando un formulario de inicio de sesión en lugar de http_basic, por lo que el firewall "api" solicita al usuario que vuelva a iniciar sesión incluso cuando el usuario se autentica mediante el formulario de inicio de sesión. ¿Hay alguna manera de hacer que funcione? – Xocoatzin

Cuestiones relacionadas