php - 如何使用 Symfony 2 应用程序的内部处理程序将用户注销

标签 php security symfony logout

Symfony 实现了用户注销和杀死 cookie 的功能。有一个 LogoutListener 将这些操作委托(delegate)给几个注销处理程序:CookieClearingLogoutHandler 和 SessionLogoutHandler。

如果我们想手动将用户从应用程序中注销,我认为最好的做法是调用这些处理程序,而不是自己实现(重复)此类低级逻辑。

可以这样做吗?

最佳答案

您可以通过覆盖默认的 security.logout_listener 服务来实现扩展的注销监听器。

默认的 LogoutListener::requiresLogin(...) 方法仅检查请求路径是否等于防火墙的 logout_path 设置。

看起来像这样:

protected function requiresLogout(Request $request)
{
    return $this->httpUtils->checkRequestPath(
        $request, $this->options['logout_path']
    );
}

现在假设您希望在 session 参数 logout 设置为 true 时执行注销。

因此,我们扩展了 LogoutListener 类,并添加了带有附加逻辑的自定义 requiresLogout() 方法。

namespace Your\Name\Space;

use Symfony\Component\Security\Http\Firewall\LogoutListener;
use Symfony\Component\HttpFoundation\Session\SessionInterface;

class MyLogoutListener extends LogoutListener {

    /**
     * Whether this request is asking for logout.
     *
     * @param Request $request
     *
     * @return Boolean
     */ 
    protected function requiresLogout(Request $request)
    {
        if ( $request->getSession()->get('logout') ) {
            return true;
        }

        return parent::requiresLogout($request);
    }

之后,我们只需使用 config.yml 中的自定义类覆盖 security.logout_listener.class 容器参数即可。

parameters:
    security.logout_listener.class: \Your\Name\Space\MyLogoutListener

现在您可以在 ...Controller 中注销用户,如下所示:

 public function someAction(Request $request) { 

     // ... some logic here

     if ($condition) {      
         $request->getSession()->set('logout', true);
     }
 }

关于php - 如何使用 Symfony 2 应用程序的内部处理程序将用户注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28828420/

相关文章:

security - 在 vuex 状态中保存 jwt 是一个安全问题吗?

authentication - 使用电子邮件而不是用户名的Symfony2身份验证/登录

php - 安全网络连接(例如 SSL)由 Web 服务器处理,对吗?

c# - 如何发送客户端特定的受信任证书颁发机构来决定用户可以在 asp.net web 表单站点上使用哪些客户端证书

php - Azure:应用程序内使用 MySQL 的 WordPress 数据库的默认用户/密码在哪里(预览版)?

php - 如果用户只查看自己的数据——是否存在 XSS 风险?

mysql - 教义 : a more efficient way to fetch all related entities in one swoop?

symfony - 仅从实体关系中获取 ID,而不获取 Doctrine 中的整个对象

php - 使用远程 .txt 文件中的数据更新文本

构建简单安全函数时的 PHP 逻辑运算符 "&&"和 "||"