据我了解,当用户成功登录时,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
用于新密码。
如果是这种情况,我想知道: -在User
从 security.token_storage
(我猜这将是一个在 fetch 事件上运行的服务。)
或者也许我把事情复杂化了,有一个超级简单的解决方案,我只是还没想出来=|