我在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 ms
有没有简单的方法可以禁用此行为?也许在会话变量中序列化用户数据或以某种方式缓存它们?
答案 0 :(得分:11)
您可以在refreshUser
的{{1}}方法中更改此行为。
使用doctrine:There is an issue at FosUserBundle github执行此操作时应该小心,解释陷阱:
将它存储在会话中会导致几个问题,这就是为什么默认情况下不会这样做的原因:
如果管理员更改了用户的权限,则只有下次从数据库中检索用户时,更改才会生效。因此,必须小心地缓存用户以避免安全问题
如果您只是重复使用在会话中序列化的用户,它将不再由Doctrine管理。这意味着只要您想要修改用户或在关系中使用用户,就必须将其合并回UnitOfWork(它将返回与防火墙使用的对象不同的对象)。合并也会触发数据库查询。并且需要这样的逻辑将打破一些内部控制器,这些控制器期望能够使用用户对象进行更新。