Как настроить прослушиватель 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. Если вы это сделали, остальное зависит от конфигурации:
- 
в настройки безопасности, настройки
remember_meфункции для вашего брандмауэра. Предполагая, что вы настраиваете что вpublicбрандмауэр, добавленные параметры конфигурации могут выглядеть примерно так:firewalls: public: remember_me: key: "%secret%" lifetime: 31536000 # 365 days in seconds path: / domain: ~ # Defaults to the current domain from $_SERVER - 
в той же конфигурации включите функцию remember_me для поставщика проверки подлинности. Предполагая, что вы настраиваете это в
publicбрандмауэр и вашSecurityFactoryInterfaceреализацииgetKey()возвращаетyourAuthProviderKeyдополнительные параметры конфигурации может выглядеть примерно так:firewalls: public: yourAuthProviderKey: remember_me: true наконец, когда ваш Поставщик аутентификации обрабатывает логины, убедитесь, что вы запрашиваете функцию remember me, имея параметр HTTP GET или POST с именем
_remember_meсо значением1в http-запросе. (Заметим, однако, этот параметр может потребоваться другое имя, если вы изменили значение по умолчанию в сетевой конфигурацией.) Например, в моем случае я должен был сказать Facebook перенаправить на следующий URL-адрес после обработки аутентификации:http://www.mydomain.com/auth-callback/?_remember_me=1. (Обратите внимание на часть после?)
надеюсь, что это помогает!
из 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))
        ;
    }