symfony 3.4 Обновление деаутентифицированного пользователя устарело

при попытке обновить существующий проект symfony с 3.3.10 до 3.4.x, который должен быть LTS, мне удалось обновить компоненты через композитор. после обновления все работает, как ожидалось, но модульные тесты показывают ошибку устаревания

Refreshing a deauthenticated user is deprecated as of 3.4 and will trigger a logout in 4.0: 77x

некоторые поисковые запросы указывают мне на коммиты, которые, вероятно, показывают изменение https://github.com/showpad/Symfony-Security/pull/1/commit/3663bbec5fc60565de476fc180f85e1121339072

поэтому я попытался решить эту проблему, и после того, как покопался в коде, я поместил новую настройку в security.xml

         main:
+            logout_on_user_change: true
             anonymous: ~

это устраняет предупреждение об устаревании, но полностью нарушает аутентификацию с использованием настраиваемого объекта, пользователь вообще не аутентифицируется, а журнал показывает ошибку:

[2017-12-07 15:48:24] security.DEBUG: Token was deauthenticated after trying to refresh it. {"username":"aaa","provider":"Symfony\\Bridge\\Doctrine\\Security\\User\\EntityUserProvider"} []

Итак, вопрос в том, «как правильно решить проблему устаревания»?


person Radoslav Bodo    schedule 07.12.2017    source источник
comment
какое-нибудь решение для этого?   -  person Braian Mellor    schedule 12.04.2018
comment
Добавьте пароль в функции сериализации / десериализации.   -  person COil    schedule 12.04.2018


Ответы (1)


проблема неработающей аутентификации 2017-12-07 15:48:24] security.DEBUG: Token was deauthenticated after trying to refresh it. {"username":"aaa","provider":"Symfony\\Bridge\\Doctrine\\Security\\User\\EntityUserProvider"} []

было то, что я не следовал документации https://symfony.com/doc/3.4/security/entity_provider.html#create-your-user-entity, в котором говорится, что должно быть также поле пароля (я бы не позволил symfony слишком много раз помещать учетные данные на диск ). В symfony 3.3 это было нормально, в symfony 3.4 поле должно присутствовать ...

diff --git a/src/GuserBundle/Entity/User.php b/src/GuserBundle/Entity/User.php
index 4adeaf9..b1b33fd 100644
--- a/src/GuserBundle/Entity/User.php
+++ b/src/GuserBundle/Entity/User.php
@@ -152,13 +152,13 @@ class User implements AdvancedUserInterface, \Serializable {
        /** @see \Serializable::serialize() */
        public function serialize() {
-               return serialize(array($this->id, $this->username, $this->active,));
+               return serialize(array($this->id, $this->username, $this->password, $this->active, $this->locked));
        }
        /** @see \Serializable::unserialize() */
        public function unserialize($serialized) {
-               list($this->id, $this->username, $this->active,) = unserialize($serialized);
+               list($this->id, $this->username, $this->password, $this->active, $this->locked) = unserialize($serialized);
        }
person Radoslav Bodo    schedule 17.03.2018
comment
Примите свой ответ. Следует уточнить, что пароль должен быть включен в функцию сериализации. - person COil; 12.04.2018
comment
Если вам действительно не нравится хранить пароли в сеансе, попросите вашего пользователя реализовать EquatableInterface и настроить isEqualTo ($ sessionUser), чтобы не проверять пароли. - person Cerad; 11.04.2019