Подтвердить что ты не робот

Запомнить меня не работает в Symfony2

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

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

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

EDIT: я до сих пор не нашел решение этого вопроса...

EDIT2: Теперь появилась новая проблема. Файл cookie REMEMBERME не устанавливается вообще. Как это решить?

SOLVED: см. ответ ниже

4b9b3361

Ответ 1

Джон.

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

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

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

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

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

Решение:

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

Ответ 2

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

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

Источник: http://www.mail-archive.com/[email protected]/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] }

Ответ 3

У меня возникла эта проблема, и проблема заключалась в том, что я не использовал одиночные кавычки в свойстве раздела запомнить_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

Ответ 4

попытайтесь увеличить продолжительность жизни сеанса: (Config.yml)

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

Вы также должны убедиться, что ваш вход "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