2012-09-06 10 views
5

Tenemos un sistema donde los administradores y usuarios estándar son manejados por sus propios proveedores de seguridad independientes. Esto ha causado un problema en las páginas administrativas porque los administradores no pueden acceder a ningún archivo o imagen que se encuentre detrás del firewall del sitio principal, a menos que también hayan iniciado sesión en el sitio principal.Symfony 2: Acceder a una ruta cortafuegos con dos proveedores separados

Las imágenes y archivos deben estar accesibles para todos los usuarios y administradores autenticados, independientemente del proveedor. Se sirven a través de un controlador que proporciona un control de acceso de grano más fino.

¿Es posible definir más de un proveedor para permitir el acceso a una ruta?

Aquí hay una versión simplificada de nuestro security.yml actual:

security: 
    providers: 
     admin_user_db: 
      entity: { class: OurAdminUserBundle:AdminUser, property: username } 
     site_user_db: 
      entity: { class: OurSiteUserBundle:SiteUser, property: username } 
    firewalls: 
     admin_login: 
      pattern: ^/admin/login$ 
      security: false 
     site_user_login: 
      pattern: ^/login 
      security: false 
     file_route: 
      pattern: ^/file 
      anonymous: ~ 
      ### We need to allow this route only for authorized users from 
      ### either admin_user_db or site_user_db providers 
     admin_secured_area: 
      pattern: ^/admin 
      http_basic: ~ 
      provider: admin_user_db 
      form_login: 
       check_path: /admin/login_check 
       login_path: /admin/login 
      logout: 
       path: /admin/logout 
       target:/
     site_secured_area: 
      pattern: .* 
      http_basic: ~ 
      provider: site_user_db 
      form_login: 
       check_path: /check_login 
       login_path: /login 
       failure_path: /login 
       failure_forward: false 
      logout: 
       path: /logout 
       target:/

Respuesta

5

supongo que lo que busca es ChainProvider. Este proveedor estará configurado para usar sus dos proveedores actuales de forma secuencial.

El proveedor de la cadena intentará en primer lugar autenticar al usuario con el primer proveedor con el que se configuró. Si es un éxito, el usuario se autentica. Si se trata de un error, el proveedor de la cadena probará el siguiente y así sucesivamente hasta que no se puedan probar más proveedores.

Utilicé esta técnica para permitir a los usuarios autenticarse con el inicio de sesión de formulario o el inicio de sesión de Facebook. Tenía dos proveedores, uno para Facebook y otro para formulario. Luego, en mi firewall, el proveedor era el proveedor de la cadena y luego, los usuarios podían iniciar sesión con sus credenciales o con su cuenta de Facebook.

Dado que el proveedor de la cadena es secuencial, lo que sugiero es que coloque primero al proveedor que probablemente usará con más frecuencia.

Aquí una muestra de configuración tomada del sitio de documentación de Symfony:

security: 
    providers: 
     chain_provider: 
      chain: 
       providers: [in_memory, user_db] 
     in_memory: 
      users: 
       foo: { password: test } 
     user_db: 
      entity: { class: Acme\UserBundle\Entity\User, property: username 

Puede echar un vistazo a la Documenation aquí:

  1. Using Multiple User Providers

Saludos, Matt

+0

Gracias por la respuesta, pudimos configurar el 'ChainProvider' con estas instrucciones (aunque creo que la sintaxis era un poco diferente en nuestra versión de Symfony). Finalmente terminamos abandonando el 'AdminUser' y usando roles en su lugar, como sugiere @jperovic, ya que nos dimos cuenta de que los proveedores independientes no son realmente necesarios en nuestro escenario. – Kaivosukeltaja

1

Tenía algo de experiencia con este problema y la solución fue la que escribió Matt.

Sin embargo, dado que la aplicación tenía cortafuegos de Administración, Estudiantes y Maestros, no pude lograr una suplantación exitosa cuando era necesario. Es decir, los usuarios de la Administración pueden suplantar a los usuarios de su firewall y esos solo.

Ahora bien, es posible que hice algo mal, sino porque esto era tarea delicada vez que decidí poner todo detrás único servidor de seguridad y dejar que los diferentes papeles hacer el trabajo. Esta resultó ser una solución mucho más simple, pero finalmente depende de usted ...