php - 如何销毁 Symfony 2 中的所有 session

标签 php symfony session logout

更新

经过详细调查和咨询一些专家,我发现破坏 session 的想法是不正确的。更好的问题是 — «如何强制所有用户注销»。

这个问题不应该从 session 的角度来解决,这是一种相当低级的机制,而应该从安全组件的角度来解决。即使您删除所有 session 数据,它也会在下一个用户请求时通过remember me cookie 重新创建。

稍后我会尝试给出这个问题的有效解决方案。

问题

我需要实现所谓的应用程序 «lockdown» 功能,因此我需要一种方法将所有用户从 Symfony 2 应用程序中注销(关闭所有事件 session )。

实现此功能的最佳方法是什么?

理想情况下,该解决方案应完全兼容所有可能的 save-handlers .

看起来 SessionHandlerInterface 没有提供这样做的方法。

最佳答案

编程方法应该是使用 session 监听器并在特定事件存在时使 session 无效,例如数据库表中事件的标志/时间戳或类似的东西。

如本文所述

Invalidate the Session Based on its Age

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;

class SessionListener
{

    /**
     * @var \Acme\DemoBundle\Service\SessionInvalidator
     */
    protected $sessionInvalidator;

    function __construct($sessionInvalidator)
    {
        $this->sessionInvalidator=$sessionInvalidator;
    }


    public function onKernelRequest(GetResponseEvent $event)
    {
        if ($event->getRequestType() !== HttpKernelInterface::MASTER_REQUEST) {
            return;
        }

        $session = $event->getRequest()->getSession();
        $metadataBag = $session->getMetadataBag();

        $lastUsed = $metadataBag->getLastUsed();
        if ($lastUsed === null) {
            // the session was created just now
            return;
        }

        // "last used" is a Unix timestamp

        if (! $this->sessionInvalidator->checkTimestampIsValid($lastUsed))
         $session->invalidate();
    }
}

和配置:

<service id="amce_security.verify_session_listener"
         class="Acme\DemoBundle\EventListener\SessionListener">
<argument type="service" id="acme.session_invalidator"/>
    <tag name="kernel.event_listener"
         event="kernel.request"
         priority="100"
         method="onKernelRequest" />
</service>

希望对你有帮助

关于php - 如何销毁 Symfony 2 中的所有 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28805856/

相关文章:

unit-testing - Symfony2 单元测试中的模拟 Controller

c# - 如何在 ASP.NET 和 C# 中的每个 session 中将 "temporarily"图像存储在 Web 服务器上

php - 我的代码的最后一行出了什么问题?

javascript - 通过动态接受输入来检索数据

symfony - Sonata Admin 中的自定义批处理操作

php - 基于 Symfony 2 的项目的安全性和登录

php - PHP 中没有 cookie 的 CSRF token

c# - 使用 session 状态在 ASP.NET 中创建用户登录和角色是一种不安全的方式

php - mysql_fetch_array 可以获取 mysql_query 作为参数吗?

javascript - 文本区域垂直大小和自动调整大小