Как настроить слушателя 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.

530   5  

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. Наконец, когда ваш поставщик аутентификации обрабатывает логины, убедитесь, что вы запросили функцию Запомнить меня по наличие параметра HTTP GET или POST с именем _remember_me со значением 1 в запросе http. (Однако обратите внимание:этому параметру может потребоваться другое имя, если вы изменили его значение по умолчанию в конфигурации безопасности.) Например, в моем случае мне пришлось сказать Facebook, чтобы он перенаправил на следующий URL-адрес после того, как он обработал аутентификацию: http://www.mydomain.com/auth-callback/?_remember_me=1. (Обратите внимание на часть после ?)

Надеюсь, это поможет!

Вы добавили это в свой раздел form_login?

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))
        ;
    }

Comments

    Ничего не найдено.