2009-11-20 83 views
1

只是想知道是否有人有同樣的問題。Cakephp會話丟失在Flash播放器

該網站需要登錄才能執行某些任務。我們使用股票Auth組件來完成這項工作。

一切都很好,直到它擊中在Flash中構建的接口。和Amf說話似乎很好。但是,當Flash播放器試圖與其他控制器交談時 - 因爲會話沒有呈現而得到重定向。

所以,基本上當用戶登錄 - 我需要以某種方式找到一種方式登錄Flash播放器以及。


增加: 這隻能解決一半的問題。

回溯一點點。 Auth組件如何評估請求者?

如果Session.checkAgent爲true。他們檢查它是否是最後一個。所以Flash沒有機會擁有不同的Agent字符串。

現在好 - 驗證檢查出來 - 什麼?他們之前存儲的會話cookie ...再次失敗。

UPDATE

感謝所有的答案。

我試過了建議的解決方案。只有一個問題。

當我試圖測試$ this-> params ['actions']是否以amf開頭時,我使用Amf(作爲Cakephp插件) - 它在某個時間有效並不適用。看着「查爾斯」,我可以看到他們都打電話給amf控制器。很不解....

回答

2

中的config/core.php中 嘗試在controllere的beforeFilter行動由Flash調用

Configure::write('Session.checkAgent', false); 
0

使用本:

if ($this->action == 'flashCalledAction') { 
    Configure::write('Security.level', 'medium'); 
    //Using instead the session specified 
$this->Session->destroy(); 
$this->Session->id($_REQUEST['sessionId']); 
$this->Session->start(); 

// We revert to the original userAgent because starting a new session modified it 
$this->Session->write('Config.userAgent', $_REQUEST['userAgent']); 
// We delete the flash cookie, forcing it to restart this whole process on each request 
setcookie(Configure::read('Session.cookie'), '', time() - 42000, $this->Session->path);   
    } 

,那麼你必須通過這些在每個閃光燈調用2個參數給該控制器:

param: 'userAgent' -> value: '$this->Session->read('Config.userAgent')' 
param: 'sessionId' -> value: $this->Session->id() 
1

看來,如果你在任何調用Session-> read(),Session-> check()或Session-> write()之前設法調用你的Session-> id($ sessionId)需要打擾所有銷燬舊會話,更新userAgent和刪除cookie的東西。

0

Flash不會發送cookie及其請求,這就是爲什麼Cake不會將其登錄。我這樣做的方式是:您需要以某種方式將$this->Session->id()與您的Flash請求一起傳遞。這可能是最困難的部分,因爲某些Flash應用程序不允許您在請求中標記一些信息。然後編寫一個組件(FlashComponent,或任何你想調用它)來檢查它是否是一個Flash請求,然後在請求中查找會話ID並設置會話ID。你需要在'Auth'之前包含這個組件:所以var $components = array('Flash','Auth',...)在Auth之前攔截請求。

或者你可以設置Auth-> allow list,但是你會將這些操作暴露給非授權,並且操作不會知道當前登錄的用戶是誰(除非你可以在flash請求中傳遞某些內容在這種情況下,請使用我的第一個解決方案)。