symfony 3.4“;不推荐刷新未经身份验证的用户";

symfony 3.4“;不推荐刷新未经身份验证的用户";,symfony,symfony-3.4,Symfony,Symfony 3.4,在尝试将现有的symfony项目从3.3.10升级到3.4.x(应该是LTS)时,我通过composer成功地升级了组件。升级后,所有功能都按预期工作,但单元测试显示弃用错误 Refreshing a deauthenticated user is deprecated as of 3.4 and will trigger a logout in 4.0: 77x 有人在谷歌上搜索,指向可能显示更改的提交 所以我试图解决这个问题,在深入研究代码之后,我在security.xml中添加了一个新

在尝试将现有的symfony项目从3.3.10升级到3.4.x(应该是LTS)时,我通过composer成功地升级了组件。升级后,所有功能都按预期工作,但单元测试显示弃用错误

Refreshing a deauthenticated user is deprecated as of 3.4 and will trigger a logout in 4.0: 77x
有人在谷歌上搜索,指向可能显示更改的提交

所以我试图解决这个问题,在深入研究代码之后,我在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"} []

因此,问题是“如何正确解决弃用问题”?

身份验证中断的问题

2017-12-07 15:48:24]security.DEBUG:令牌在尝试刷新后被取消身份验证。{“username”:“aaa”,“provider”:“Symfony\\Bridge\\doctor\\Security\\User\\EntityUserProvider”}[]

是的,我没有遵循文档中的说明,也应该有密码字段(我不会让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);
        }

有解决方案吗?在序列化/取消序列化函数中添加密码。接受您的答案。您应该澄清密码必须包含在serialize函数中。如果您确实不喜欢在会话中存储密码,请让您的用户实现EqualTableInterface,并将isEqualTo($sessionUser)调整为不检查密码。