2012-04-08 76 views
8

我在symfony 2.0中使用我自己的User类作为安全系统的实体提供者。Symfony 2 - 如何在每次页面加载时禁用查询用户?

我注意到,在页面的symfony每个重装从数据库中提取用户:

选择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 credentials 7 FROM w9_users t0 WHERE t0.id =?参数:['23']时间:4.43 ms

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

回答

11

您可以在UserProviderrefreshUser方法中更改此行为。

教义这样做时,您应该谨慎:There is an issue at FosUserBundle github,解释的缺陷:

会话存储这会导致一些问题,这就是为什么它是不是默认设置:

如果管理员更改用户的权限,则更改仅在下次从数据库检索用户时才会生效。因此缓存用户必须认真完成以避免安全问题

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

相关问题