Функция Запомнить меня не работает в Symfony2 - PullRequest
13 голосов
/ 18 сентября 2011

Я реализовал функцию запомнить меня в Symfony2.Когда я вхожу с установленным флажком запомнить меня, создается файл cookie с именем «REMEMBERME».Этот файл cookie также доступен, если я закрою браузер и открою его через много часов.Но когда я загружаю домашнюю страницу своего приложения, cookie автоматически удаляется, и я не вижу ни одного пользователя, вошедшего в систему. Может кто-нибудь объяснить мне причину удаления cookie?

remember_me:
          key:      qwerty
          lifetime: 604800
          path:     /
          domain:   ~ 

Это мой раздел файла security.yml

РЕДАКТИРОВАТЬ: Я до сих пор не нашел решение этого вопроса ...

РЕДАКТИРОВАТЬ2: Теперь есть новая проблема,Файл cookie REMEMBERME вообще не устанавливается.Как это решить ??

решено: см. Ответ ниже

Ответы [ 10 ]

13 голосов
/ 11 июня 2012

Хотя на этот вопрос уже был дан ответ, я хотел бы предложить возможное решение, если только для потомков и рефералов поиска Google для этой проблемы:)

"Проблема проста: запомненное использованное не даетиметь роль IS_AUTHENTICATED_FULLY, но только IS_AUTHENTICATED_REMEMBERED, чтобы сделать разницу между запомненным пользователем и пользователем, который вошел в систему "

Источник: http://www.mail-archive.com/symfony-users@googlegroups.com/msg34021.html

Это означает, что в вашей конфигурации безопасности вы должны убедиться, что для каждой записи ACL настроена роль IS_AUTHENTICATED_REMEMBERED в дополнение к роли IS_AUTHENTICATED_FULLY.

Например,:

#app/config/security.yml
security:
    ...
    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/, role: [IS_AUTHENTICATED_FULLY,IS_AUTHENTICATED_REMEMBERED] }
11 голосов
/ 11 февраля 2012

Джон.

У меня та же проблема, что и у вас (или у вас), но я обнаружил, что когда я (Symfony2 на самом деле =)) установил REMEMBERME cookie в строке 101 at / vendor / symfony / src / Symfony / Component / Security / Http / RememberMe / TokenBasedRememberMeService.php file $ user-> getPassword () возвращает NULL Таким образом, cookie получает хэш, рассчитанный со значением пароля NULL.

Что произойдет дальше, когда вы вернетесь на свой сайт с полной уверенностью в том, что вы будете автоматически аутентифицированы, Symfony начнет проверять ваш файл cookie в файле, аналогичном указанному выше , но в строке 58 он обнаруживает, что cookie хеш не совпадает с , он ожидает и выдает исключение ('Хэш cookie недействителен.') Внутренне перехватывает его и отправляется куда-то.

Так вот почему в моем случае cookie не работает.

Я еще не нашел решения, но я отыщу его и, возможно, мне повезет.

Надеюсь, что ваша проблема такая же, и решение поможет нам обоим.

Решение:

При реализации eraseCredentials (), который, как утверждается, будет использоваться для удаления конфиденциальных данных пользователя из UserInterface, не выполняет $ this-> password = null. Я сделал эту ошибку, потому что я не понимаю ее цели. Вы можете взглянуть на Выход из Symfony 2 (UserInterface :: eraseCredentials) для небольшого объяснения. Таким образом, он сериализует маркерный объект, и мы попали в беду.

1 голос
/ 26 февраля 2016

У меня была эта проблема, и проблема заключалась в том, что я не использовал одинарные кавычки в разделе ключ раздела Remember_me (security.yml). Изменить это :

remember_me:
    key:      qwerty
    lifetime: 604800
    path:     /
    domain:   ~

на это :

remember_me:
    key:      'qwerty'
    lifetime: 604800
    path:     /
    domain:   ~

Вы можете проверить это в документации Symfony:http://symfony.com/doc/2.7/cookbook/security/remember_me.html

0 голосов
/ 04 января 2019

В моем случае аутентификаторы были перезаписаны с помощью метода supportsRememberMe:

public function supportsRememberMe()
{
    return true; // change it to true
}
0 голосов
/ 06 августа 2018

Я использую Symfony 4, и у меня была похожая проблема, файлы cookie REMEMBERME не были установлены.

Моя проблема заключалась в том, что у меня было value="", установленное в поле флажка типа ввода.

Итак, я перешел с этого

<input type="checkbox" value="" id="remember_me" name="_remember_me">

на этот

<input type="checkbox" id="remember_me" name="_remember_me">

0 голосов
/ 27 апреля 2018

У меня была такая же проблема. После расследования я обнаружил, что: /vendor/symfony/doctrine-bridge/Security/User/EntityUserProvider.php::loadUserByUsername() требует, чтобы либо было установлено поле property вашего провайдера пользователя сущности, либо чтобы ваш репозиторий реализовал Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface и имел метод loadUserByUsername().

Я только что добавил поле свойства примерно так:

providers:
    user_provider:
        entity:
            class: App\Entity\User
            property: email
0 голосов
/ 10 января 2017

Вы также должны убедиться, что ваш ввод "Remember_me" в форме входа не имеет атрибута значение :

Это правильно :

<input type="checkbox" id="remember_me" name="_remember_me" />

Но это не сработает :

<input type="checkbox" id="remember_me" name="_remember_me" value="" />

Если вы используете form_login, проверьте также, что Remember_me включен в security.yml:

firewalls:
    main:
        form_login:
            # ...
            remember_me: true
0 голосов
/ 09 января 2017

В моем случае я реализовал пользовательский обработчик входа, который возвращал RedirectResponse согласно документации. Оказывается, это заставляет Symfony обходить стандартную процедуру входа в систему и приводит к тому, что файл cookie REMEMBERME не создается / не сохраняется.

Мне пришлось удалить обработчик входа в систему, реализовать пользовательский прослушиватель входа со всей необходимой логикой.

Вы можете увидеть, как реализовать прослушиватель входа в систему здесь

0 голосов
/ 30 августа 2013

В моем случае это была неправильная реализация метода SupportClass моего userProvider , что, в свою очередь, вызвало исключение в классе TokenBasedRememberMeService в строке 43 (выбрасывается getUserProvider , и перехватывается в другом месте, таким образом, молча терпит неудачу). Копание пути, показанного Дмитрием, заставило меня решить проблему.

0 голосов
/ 15 января 2012

попробуйте увеличить время вашей сессии: (Config.yml)

  framework:
    session:
        default_locale: %locale%
        auto_start:     true
        lifetime:       604800
...