Как настроить прослушиватель remember me aware в Symfony 2?

я реализовал пользовательский поставщик проверки подлинности успешно, но теперь мне также нужно добавить функциональность "Запомнить меня", и я не мог найти документы о том, как это сделать.

Я попытался добавить это:

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

но в нем говорится следующее:

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

Я нашел это, но я не уверен, как его использовать:SymfonyComponentSecurityCoreAuthenticationProviderRememberMeAuthenticationProvider

где RememberMeAwareInterface? (Я думаю, есть один? Как ContainerAware) и что мне делать с это?

Я не думаю, что мне нужно писать свою собственную реализацию, по умолчанию должен работать нормально с моим настраиваемым поставщиком auth.

5 ответов


у меня была такая же проблема с пользовательским поставщиком аутентификации Facebook, который я написал. Решение оказалось довольно простым:

я предполагаю, что вы реализовали пользовательский поставщик проверки подлинности с пользовательским SecurityFactoryInterface реализации, которая простирается от Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\AbstractFactory. Если вы это сделали, остальное зависит от конфигурации:

  1. в настройки безопасности, настройки remember_me функции для вашего брандмауэра. Предполагая, что вы настраиваете что в public брандмауэр, добавленные параметры конфигурации могут выглядеть примерно так:

    firewalls:
        public:
            remember_me:
                key:      "%secret%"
                lifetime: 31536000 # 365 days in seconds
                path:     /
                domain:   ~ # Defaults to the current domain from $_SERVER
    
  2. в той же конфигурации включите функцию remember_me для поставщика проверки подлинности. Предполагая, что вы настраиваете это в public брандмауэр и ваш SecurityFactoryInterface реализации getKey() возвращает yourAuthProviderKey дополнительные параметры конфигурации может выглядеть примерно так:

    firewalls:
        public:
            yourAuthProviderKey:
                remember_me:        true
    
  3. наконец, когда ваш Поставщик аутентификации обрабатывает логины, убедитесь, что вы запрашиваете функцию remember me, имея параметр HTTP GET или POST с именем _remember_me со значением 1 в http-запросе. (Заметим, однако, этот параметр может потребоваться другое имя, если вы изменили значение по умолчанию в сетевой конфигурацией.) Например, в моем случае я должен был сказать Facebook перенаправить на следующий URL-адрес после обработки аутентификации:http://www.mydomain.com/auth-callback/?_remember_me=1. (Обратите внимание на часть после ?)

надеюсь, что это помогает!


вы добавили это в свой ?

form_login:
    remember_me: true

из Symfony 2.8 "ключ" заменяется на "секретный". Так что у вас будет:

remember_me:
   secret: %secret%
   lifetime: 31536000

Если вы столкнулись с этой ошибкой, это исправление


вы можете попробовать это:

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

в моем случае это произошло, когда я создал класс фабрики, реализующий SecurityFactoryInterface (как это было описано в примере "как создать пользовательский поставщик аутентификации"). Позже я обнаружил, что другой способ создать эту фабрику-это расширение от AbstractFactory, который содержит необходимый материал readme (вы можете найти его метод create ()). Таким образом, есть два решения: 1) расширить AbstractFactory вместо реализации SecurityFactoryInterface 2) реализовать SecurityFactoryInterface и copypaste readme связанный код. В 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))
        ;
    }