Как настроить слушателя 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Наконец, когда ваш поставщик аутентификации обрабатывает логины, убедитесь, что вы запросили функцию Запомнить меня по наличие параметра 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)) ; }
Comments