【问题标题】:Symfony 2 - how to disable querying user at every page load?Symfony 2 - 如何在每次页面加载时禁用查询用户?
【发布时间】:2012-04-21 02:55:36
【问题描述】:

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

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

【问题讨论】:

  • 还是没有好的答案?

标签: security optimization symfony


【解决方案1】:

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

使用教义进行此操作时应小心:There is an issue at FosUserBundle github,解释陷阱:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-06-10
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 2013-07-15
    相关资源
    最近更新 更多