如何在 Symfony 中注销被禁止的用户?

How to log out a banned user in Symfony?

如果用户 class 实现了 AdvancedUserInterface.

,Symfony 提供了一种防止用户使用 isEnabled 属性 登录的简单方法

但是,如果用户已登录,则在会话过期之前,没有任何事情会阻止他们访问该网站。

想法是在获取用户实体 ($this->get('security.token_storage')->getToken()->getUser()) 时检查 isEnabled 属性,然后使会话无效。这样做的首选方式是什么?

或者有更好的方法来实现这个目标吗?

也许在控制器执行之前捕获请求(我认为有一个侦听器),检查他的帐户是否被阻止,如果是真的,只需做出 403 响应并 hasta la vista baby

更好的方法是将它们重定向到由安全系统处理的 logout url。您可以通过创建一个侦听 kernel.request 事件的侦听器来实现。 Here is a gist 我大约一个月前创建的,它提供了这样的功能..

您可以在 security.yml 中设置以下内容:

security:
    always_authenticate_before_granting: true

这将始终在将信息存储到令牌之前重新验证用户。它将处理用户配置中的此类更改,以及更改角色等。

您可以使用自定义用户提供程序执行此操作(如果您已经在使用自定义用户提供程序,这是一个简单的更改)。

http://symfony.com/doc/current/cookbook/security/custom_provider.html

loadUserByUsername 在用户登录时调用。

refreshUser 在每个后续请求中调用。用户对象被反序列化,然后刷新。然后你可以在刷新方法中做任何你想做的事情,包括从数据库重新加载它并检查用户是否被禁止。