Как правильно открыть сессию с помощью symfony2? - PullRequest
0 голосов
/ 13 ноября 2011

Я использую флэш-компонент в своем приложении symfony2, который загружает несколько изображений, и когда они достигают сервера, я хочу снова открыть сеанс, чтобы я мог сохранить изображение в месте, относящемся к зарегистрированному пользователю. Я отправляю идентификатор сессии PHP при каждой загрузке файла ...

В ванильном PHP я могу добиться этого по принципу ...

session_id($originalSessionId);
session_start();

но есть ли у symfony2 способ сделать это с помощью контекста безопасности?

РЕДАКТИРОВАТЬ: Это похожий вопрос , хотя я хочу, возможно, создать какой-либо логин на основе токена, передав токен и защитив URL для загрузки с помощью отдельного межсетевого экрана.

Ответы [ 4 ]

6 голосов
/ 03 января 2012

Во-первых, вам нужно создать свой собственный класс хранения сеанса, как показано ниже:

<?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]
3 голосов
/ 16 ноября 2011

Я столкнулся с той же проблемой при использовании SWFUpload для загрузки нескольких файлов. То, что я сделал, было измененным приложением [_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(),
    ),
));

Надеюсь, это поможет!

1 голос
/ 16 ноября 2011

Как вы, наверное, знаете, Symfony направляет все запросы в app или app_dev.php.Я бы добавил правило перезаписи для страницы загрузки в новый файл php, здесь, если идентификатор сеанса находится в переменных $ _GET, установите его как $ _COOKIE, затем включите app.php или app_dev.php.

Выможет также сохранить файлы, в случае успеха пользователь может отправить ajax-вызов на сервер, который затем связывает эти файлы с пользователем.

Дайте мне знать, если вы найдете решение, которое не является хакерским.

0 голосов
/ 14 ноября 2011

Зачем тебе это? Идентификатор сеанса должен быть одинаковым, когда пользователь загружает изображения и когда он перенаправляется на страницу, которые обрабатывают их Symfony автоматически запускает вашу сессию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...