2011-11-13 26 views
0

我在我的symfony2應用程序中使用了一個flash組件,它可以上傳多個圖像,當它們到達服務器時,我想重新打開會話,以便我可以將圖像存儲在相對於登錄用戶的位置。我送了PHP會話ID與每個文件上傳...如何使用symfony2正確重新打開會話?

在香草PHP,我可以沿着線實現這個...

session_id($originalSessionId); 
session_start(); 

,但有沒有這樣做使用的Symfony2的方式安全上下文?

編輯:This is a similar question,雖然我想創建一些基於令牌的登錄,通過傳遞令牌和保護上傳URL與單獨的防火牆。

回答

6

首先,您需要創建類似下面你自己的會話存儲類:然後

<?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] 
+0

嘿,那裏,是否有解決方案請今天的symfony2版本,這個似乎不再工作了: ) – Azr

+0

我什麼也沒說,這還在工作!謝謝 – Azr

-1

你爲什麼要這樣?當用戶上傳圖片時,以及他被重定向到頁面時,會話ID應該相同。 Symfony通常會自動啓動會話。

+3

Flash不發送你的會話cookie – JamesHalsall

+0

看到這個:http://stackoverflow.com/questions/1006758/setting-php-session-variables-using-flash-actionscript/1013937#1013937 – JamesHalsall

1

正如你可能知道Symfony將所有請求路由到app或app_dev.php。我會將上傳頁面的重寫規則添加到新的php文件中,如果會話ID在$ _GET變量中,則將其設置爲$ _COOKIE,然後包括app.php或app_dev.php。

您也可以保存文件,成功時讓用戶發送ajax調用服務器,而不是將這些文件與用戶相關聯。

讓我知道如果你找出一個解決方案,少了一個黑客。

3

當使用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 }} 

和Controller調用這個觀點,

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

希望這有助於!

相關問題