【问题标题】:Invalidate session for a specific user in Symfony2Symfony2 中特定用户的会话无效
【发布时间】:2015-01-16 15:17:20
【问题描述】:

我编写了一个系统,其中后台 PHP 进程(使用 RabbitMQBundle 编写)处理来自消息队列的消息。工作进程更新用户帐户。这可能包括用户角色的更改。

问题是用户在登录时不会注意到其角色的任何变化。新角色只有在注销并再次登录后才会应用。从安全角度来看,这是不可取的。一旦管理员在后端系统中取消该用户的权限,用户就应该放弃任何角色。

问题是:如何使用新角色更新特定用户的会话? 或者如果不可能,如何使会话无效?

请注意,在后台进程中,我们没有可以使用的活动security.contextrequest。因此,这样的代码不起作用:

$this->get('security.context')->setToken(null);
$this->get('request')->getSession()->invalidate();

【问题讨论】:

    标签: php symfony


    【解决方案1】:

    您可以通过多种方式解决此问题:

    1) 通过security.always_authenticate_before_granting

    您可以强制Symfony 在每个请求上刷新用户,从而有效地重新加载所有角色。

    请参阅此 SO 问题/答案: Change the role of a distant user without having to relog

    2) 通过EquatableInterface:

    您需要实现isEqualsTo(User),它又应将所有内容与User 类进行比较,包括角色。

    查看此链接:Create a User Class

    3) 最后,您可以使用DBMS 来存储会话。然后,只需找到记录并将其删除即可。

    【讨论】:

    • 谢谢!我将看看第一个选项对性能的影响。知道选项 3 是否也可以使用 Memcache 或 Redis 作为会话存储来完成?
    • 到目前为止我没有使用任何这些,但知道每个的能力我会说它是完全可行的;) 至于#1,我确实在 ~100 的项目中使用了这个选项用户,我没有注意到任何影响。这是有道理的,因为 100 个用户非常少……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2015-07-05
    相关资源
    最近更新 更多