9

我在 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

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

4

1 回答 1

11

您可以refreshUserUserProvider.

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

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

如果管理员更改用户的权限,则更改将仅在您下次从数据库中检索用户时生效。所以缓存用户必须小心,以避免安全问题

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

于 2012-04-08T19:26:28.427 回答