2012-10-09 6 views
7

He implementado un custom authentication provider con éxito, pero ahora también necesito agregar la funcionalidad 'recordarme', y no pude encontrar documentos sobre cómo hacerlo.¿Cómo configurar un oyente de Remember me aware en Symfony 2?

He intentado añadir esto:

remember_me: 
    key: "%secret%" 
    lifetime: 31536000 # 1 year 
    always_remember_me: true 

pero no dice esto:

You must configure at least one remember-me aware listener (such as form-login) for each firewall that has remember-me enabled.

me encontré con esto, pero no estoy seguro de cómo usarlo: Symfony\Component\Security\Core\Authentication\Provider\RememberMeAuthenticationProvider

Así ¿Dónde está el RememberMeAwareInterface? (¿Supongo que hay uno? Como ContainerAware) ¿Y qué debería hacer con eso?

No creo que deba escribir mi propia implementación, la predeterminada debería funcionar bien con mi proveedor de autenticación personalizado.

Respuesta

4

Estaba teniendo el mismo problema con un proveedor de autenticación de Facebook personalizado que escribí. La solución terminó siendo bastante simple:

Supongo que implementó un proveedor de autenticación personalizado con una implementación personalizada de SecurityFactoryInterface que se extiende desde Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\AbstractFactory. Si hizo esto, el resto es una cuestión de configuración:

  1. En la configuración de seguridad, configurar la funcionalidad remember_me para su cortafuegos. Suponiendo que está configurando en el servidor de seguridad public, los parametros de configuración adicionales podrían ser algo como esto:

    firewalls: 
        public: 
         remember_me: 
          key:  "%secret%" 
          lifetime: 31536000 # 365 days in seconds 
          path: /
          domain: ~ # Defaults to the current domain from $_SERVER 
    
  2. En la misma configuración, activar la funcionalidad remember_me para su proveedor de autenticación. Suponiendo que se está configurando eso en el servidor de seguridad public y el método de su SecurityFactoryInterface de aplicación getKey() devuelve yourAuthProviderKey, los parametros de configuración adicionales podrían ser algo como esto:

    firewalls: 
        public: 
         yourAuthProviderKey: 
          remember_me:  true 
    
  3. Por último, cuando el proveedor de autenticación maneja inicios de sesión, asegúrese de que usted solicite la función recordarme al tener un parámetro http GET o POST llamado _remember_me con el valor 1 en la solicitud http. (Nota: este parámetro podría necesitar un nombre diferente si cambió su valor predeterminado en su configuración de seguridad). Por ejemplo, en mi caso, tuve que decirle a Facebook que redireccionara a la siguiente URL después de manejar la autenticación: http://www.mydomain.com/auth-callback/?_remember_me=1. (Tenga en cuenta la parte después de ?)

Hope this helps!

+1

Para cualquier persona que venga de Google: cosas como Remember Me y Referer solo funcionarán si tu getPosition() en la clase que se extiende desde AbstractFactory devuelve una posición que está atrasada suficiente en la tubería. No pude encontrar descripciones exactas de las diversas cadenas aceptadas, pero, por ejemplo, 'pre_auth' es demasiado pronto para recordarme y poder trabajar automáticamente, pero 'forma' funciona bien. –

2

¿Agregaste esto a tu sección form_login?

form_login: 
    remember_me: true 
+0

No, no tengo una. Estoy usando mi propio proveedor de autenticación 'NoPasswordProvider', los usuarios inician sesión a través de un enlace único que se envía a su dirección de correo electrónico. Entonces en mi firewall, en lugar de form_login, tengo 'nopassword: true' – ChocoDeveloper

0

Puede probar esto:

firewalls:     
    secured_area: 
     pattern: ^/ 
     anonymous: ~ 
     form_login: 
      csrf_provider: form.csrf_provider 
      login_path: login 
      check_path: login_check 
      always_use_default_target_path: true 
      default_target_path: /the-cao 
      remember_me: true 
     logout: 
      path: /logout 
      target:/
     remember_me: 
      key:  "%secret%" 
      lifetime: 31536000 # 365 days in seconds 
      path: /
      domain: ~ # Defaults to the current domain from $_SERVER 
1

Desde Symfony 2.8, la "llave" se sustituye por "secreta".Por lo que tendrá:

remember_me: 
    secret: %secret% 
    lifetime: 31536000 

Si usted se encuentra con este error, que es el punto de referencia

0

En mi caso sucedió cuando creo una clase de fábrica implementar SecurityFactoryInterface (como se describe en el ejemplo "¿Cómo Crear un Proveedor de Autenticación personalizado "). Más tarde descubrí que otra forma de crear esta fábrica se extiende desde AbstractFactory, que contiene material readme necesario (puede encontrarlo en el método create()). Entonces hay dos soluciones: 1) extender AbstractFactory en lugar de implementar SecurityFactoryInterface 2) implementar SecurityFactoryInterface y copiar el código relacionado con el readme. En Symfony 3.1:

 // add remember-me aware tag if requested 
    if ($this->isRememberMeAware($config)) { 
     $container 
      ->getDefinition($listenerId) 
      ->addTag('security.remember_me_aware', array('id' => $id, 'provider' => $userProviderId)) 
     ; 
    } 
Cuestiones relacionadas