Symfony 2 - 如何在每次加载页面时禁用查询用户?

dun*_*qan 8 security optimization symfony

我在symfony 2.0中使用自己的User类和安全系统的实体提供程序.

我注意到,每次重新加载页面时,symfony都会从db中获取用户:

SELECT t0.id AS id1,t0.username AS username2,t0.salt AS salt3,t0.password AS password4,t0.email AS email5,t0.is_active AS is_active6,t0.credentials AS credentials7 FROM w9_users t0 WHERE t0.id = ?参数:['23']时间:4.43毫秒

有没有简单的方法来禁用此行为?也许在会话变量中序列化用户数据或以某种方式缓存它们?

Hak*_*yal 11

您可以在refreshUser您的方法中更改此行为UserProvider.

在使用doctrine进行此操作时应该小心:FosUserBundle github存在一个问题,解释了陷阱:

将它存储在会话中会导致几个问题,这就是为什么默认情况下不会这样做的原因:

如果管理员更改了用户的权限,则只有下次从数据库中检索用户时,更改才会生效.因此,必须小心地缓存用户以避免安全问题

如果您只是重复使用在会话中序列化的用户,它将不再由Doctrine管理.这意味着只要您想要修改用户或在关系中使用用户,就必须将其合并回UnitOfWork(它将返回与防火墙使用的对象不同的对象).合并也会触发数据库查询.并且需要这样的逻辑将破坏一些期望能够使用用户对象进行更新的内置控制器.