据我所知,当用户成功登录时,Symfony会在User
或数据库提供程序中保留session.handler.native_file
文档/实体的副本,无论哪个配置。在将来的请求中,将使用cookie中保存的会话ID检索此信息。
我的问题是用户更新其密码或用户名(即他们的电子邮件),以前在不同计算机或浏览器上打开的会话过期或设置为无效。
EquatableInterface
假设要对此进行检查,但它并不适合我。我将以下存根添加到User
类:
#User.php
public function isEqualTo(UserInterface $user)
{
return false;
}
随后刷新浏览器没有任何改变。我的会话仍然有效,并使用User
检查dump($this->getUser())
抓取给了我当前更新的User
,而不是在会话开始时存储的那个。
我尝试使用:
#security.yml
security:
always_authenticate_before_granting: true
如果它会做任何事情,但它确实没有效果。
使用 Symfony Profiler ,我看到每次执行请求时都会从数据库中获取User
,我想知道它是否在此时{{1}只是更新了UserProviderInterface
中的用户,而不是在必要时首先检查对结束会话的更改。
为了确保这种情况发生,我在两个不同的浏览器上测试了这个控制器:
security.token_storage
我在两个浏览器上登录我的应用程序,然后在浏览器A上注销。我将#SomeController.php
public function indexAction()
{
$encoder = $this->get('security.password_encoder');
$user = $this->getUser();
$flag = $encoder->isPasswordValid($user, 'MY_NEW_PASSWORD');
dump($flag);
return [];
}
密码更改为User
,只刷新浏览器B.转储为'MY_NEW_PASSWORD'
新密码。
如果是这种情况,我想知道:
- 在true
从User
获取security.token_storage
之前,是否有权在授予授权之前对数据库进行检查? (这是一个在我想的fetch事件上运行的服务。)
或者我可能会对复杂的东西感到困惑,并且有一个超级简单的解决方案,我只是想通了= |