【问题标题】:How to correctly reopen a session using symfony2?如何使用 symfony2 正确重新打开会话?
【发布时间】:2011-11-13 14:17:30
【问题描述】:

我在我的 symfony2 应用程序中使用了一个 flash 组件,它上传多个图像,当它们到达服务器时,我想重新打开会话,以便我可以将图像存储在与登录用户相关的位置。我正在发送每个文件上传的 PHP 会话 ID...

在原版 PHP 中,我可以通过以下方式实现这一点……

session_id($originalSessionId);
session_start();

但是有 symfony2 使用安全上下文的方法吗?

编辑:This is a similar question,尽管我想通过传递令牌并使用单独的防火墙保护上传 URL 来创建某种基于令牌的登录。

【问题讨论】:

    标签: flash session symfony


    【解决方案1】:

    首先,您需要创建自己的会话存储类,如下所示:

    <?php
    namespace Elao\BackBundle\Session;
    use Symfony\Component\DependencyInjection\ContainerInterface;
    use Symfony\Component\HttpFoundation\SessionStorage\NativeSessionStorage;
    
    class Storage extends NativeSessionStorage
    {
        public function __construct(array $options = array(), ContainerInterface $container)
        {
            $request = $container->get('request');
            if ($request->query->has('sessionId')) {
                $request->cookies->set(session_name(), 1);    // We have to simulate this cookie, in order to bypass the "hasPreviousSession" security check
                session_id($request->query->get('sessionId'));
            }
            return parent::__construct($options);
        }
    }
    

    然后,您必须重新定义默认值(例如在您的 config.yml 中):

    parameters:
        session.storage.native.class: ElaoBackBundleSessionStorage
    services:
        session.storage.native:
            class:     %session.storage.native.class%
            arguments: [%session.storage.options%, @service_container]
    

    【讨论】:

    • 你好,请问有今天版本的 symfony2 的解决方案吗,这个似乎不再工作了 :)
    【解决方案2】:

    我在使用 SWFUpload 允许上传多个文件时遇到了同样的问题。我所做的是修改了app[_dev].php:

    if (array_key_exists(ini_get('session.name'), $_GET)) {
        $_COOKIE[ini_get('session.name')] = $_GET[ini_get('session.name')];
    }
    

    在视图中,我将上传url设置为

    {{ path('...') }}?{{ session.name }}={{ session.value }}
    

    在调用这个视图的控制器中,

    return $this->render('...html.twig', array(
        'session' => array(
            'name' => ini_get('session.name'),
            'value' => session_id(),
        ),
    ));
    

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      你可能知道 Symfony 将所有请求路由到 app 或 app_dev.php。我会将上传页面的重写规则添加到新的 php 文件中,如果会话 ID 在 $_GET 变量中,则将其设置为 $_COOKIE,然后包括 app.php 或 app_dev.php。

      您还可以保存文件,成功后让用户向服务器发送 ajax 调用,然后将这些文件与用户相关联。

      如果你想出一个不那么简单的解决方案,请告诉我。

      【讨论】:

        【解决方案4】:

        你为什么要这个?当用户上传图片和被重定向到页面时,会话 id 应该是相同的。 Symfony 通常会自动启动您的会话。

        【讨论】:

        猜你喜欢
        • 2013-05-11
        • 1970-01-01
        • 1970-01-01
        • 2011-08-19
        • 1970-01-01
        • 2012-05-17
        • 1970-01-01
        • 2012-07-23
        • 1970-01-01
        相关资源
        最近更新 更多