Как настроить прослушиватель 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))
;
}