1

据我了解,当用户成功登录时,Symfony 将在数据库提供程序或数据库提供程序中保留User文档/实体的副本session.handler.native_file,以配置为准。在将来的请求中,会使用 cookie 中保存的会话 ID 检索此信息。

我的问题是每当用户更新其密码或用户名(这是他们的电子邮件)时,以前在不同计算机或浏览器上打开的会话不会过期或设置为无效。

应该对此EquatableInterface进行检查,但它并没有真正为我工作。当我将以下存根添加到User类中时:

#User.php
public function isEqualTo(UserInterface $user)
{
    return false;
}

随后在浏览器上刷新,没有任何改变。我的会话仍然有效,并且User使用 a 检查获取dump($this->getUser())给了我当前更新的内容User,而不是在会话开始时存储的内容。

我尝试使用:

#security.yml
security:
    always_authenticate_before_granting: true

如果它会做任何事情,但它真的没有用。

使用Symfony Profiler,我看到User每次我发出请求时都会从数据库中获取 a ,我想知道此时是否UserProviderInterface刚刚更新了用户,security.token_storage而不是在必要时首先检查对结束会话的更改。

为了确保发生这种情况,我在两个不同的浏览器上测试了这个控制器:

#SomeController.php
public function indexAction()
{
    $encoder = $this->get('security.password_encoder');
    $user = $this->getUser();

    $flag = $encoder->isPasswordValid($user, 'MY_NEW_PASSWORD');

    dump($flag);

    return [];
}

我在两个浏览器上登录了我的应用程序,然后在浏览器 A 上注销。我将User密码更改为'MY_NEW_PASSWORD'并刷新浏览器 B。转储true用于新密码。

如果是这种情况,我想知道: -在Usersecurity.token_storage(我猜这将是一个在 fetch 事件上运行的服务。)

或者也许我把事情复杂化了,有一个超级简单的解决方案,我只是还没想出来=|

4

0 回答 0