使 Symfony2 中特定用户的会话无效
Invalidate session for a specific user in Symfony2
我编写了一个系统,其中后台 PHP 进程(使用 RabbitMQBundle 编写)处理来自消息队列的消息。工作进程更新用户帐户。这可能包括用户角色的更改。
问题是用户在登录时不会注意到他的角色有任何变化。新角色只有在注销并再次登录后才会应用。从安全角度来看,这是不可取的。一旦管理员在后端系统中取消了该用户的权限,该用户就应该失去任何角色。
问题是:如何使用新角色更新特定用户的会话?或者当这不可能时,如何使会话无效?
请注意,在后台进程中,我们没有可以使用的活动 security.context
或 request
。因此,这样的代码不起作用:
$this->get('security.context')->setToken(null);
$this->get('request')->getSession()->invalidate();
您可以通过多种方式解决此问题:
1) 通过 security.always_authenticate_before_granting
您可以强制Symfony
在每次请求时刷新用户,有效地重新加载所有角色。
看到这个 question/answer:
Change the role of a distant user without having to relog
2) 通过 EquatableInterface
:
您需要实施 isEqualsTo(User)
,这反过来应该将所有内容与 User
class 进行比较,包括角色。
看到这个link:Create a User Class
3) 最后,您可以使用DBMS
来存储会话。然后,找到记录并删除它就可以了。
我编写了一个系统,其中后台 PHP 进程(使用 RabbitMQBundle 编写)处理来自消息队列的消息。工作进程更新用户帐户。这可能包括用户角色的更改。
问题是用户在登录时不会注意到他的角色有任何变化。新角色只有在注销并再次登录后才会应用。从安全角度来看,这是不可取的。一旦管理员在后端系统中取消了该用户的权限,该用户就应该失去任何角色。
问题是:如何使用新角色更新特定用户的会话?或者当这不可能时,如何使会话无效?
请注意,在后台进程中,我们没有可以使用的活动 security.context
或 request
。因此,这样的代码不起作用:
$this->get('security.context')->setToken(null);
$this->get('request')->getSession()->invalidate();
您可以通过多种方式解决此问题:
1) 通过 security.always_authenticate_before_granting
您可以强制Symfony
在每次请求时刷新用户,有效地重新加载所有角色。
看到这个 question/answer: Change the role of a distant user without having to relog
2) 通过 EquatableInterface
:
您需要实施 isEqualsTo(User)
,这反过来应该将所有内容与 User
class 进行比较,包括角色。
看到这个link:Create a User Class
3) 最后,您可以使用DBMS
来存储会话。然后,找到记录并删除它就可以了。