2012-07-09 107 views
2

我有一個symfony網站,旨在用於另一個網站上的iframe。對於所有的瀏覽器,它都能正常工作,除了Safari之外,因爲Safari不會讓iframe設置任何cookie。而不是登錄,我返回到一個空白的登錄頁面,沒有任何錯誤。無Cookie登錄到Symfony2網站

我一直在嘗試的解決方案是將PHPSESSID設置爲窗體上的隱藏字段,並使用它來跟蹤會話而不是cookie。我遇到的問題是登錄後,formlogin似乎設置了一個新的會話密鑰併發送重定向。我無法在此重定向上獲得正確的會話密鑰。

我試着通過將以下內容添加到app.php的末尾來添加會話密鑰到重定向的URL的末尾(這是非常不確定的,但我變得非常絕望)。

foreach(headers_list() as $header) { 
    if (substr($header,0,9) == "location:") { 
     if (strpos($header, '?')===FALSE && strpos($header, '#')===FALSE) { 
      header($header."?PHPSESSID=".session_id()); 
     } 
    } 
} 

這增加了一個會話密鑰,但它似乎是增加老會話密鑰,而不是已經被表單登錄新創建的一個。因此,當我嘗試登錄時,我收到消息「您的會話超時,或者您已禁用了Cookie」。

如何獲得正確的session_id?有一個更好的方法嗎?

+0

你爲什麼不乾脆寫一個行動,將通過請求其返回當前會話ID? – 2012-07-30 15:19:42

回答

1

你得到的僅僅是附加的安全檢查,以防止惡意用戶僞造會話。如果您嘗試使用登錄表單加載頁面,然後刪除所有cookie,然後嘗試進行身份驗證,則會發生相同的行爲。

檢查定義爲this line。檢查方法是self-explained,很清楚。

對於你的特殊任務,我會說這不是首選行爲,所以你應該重寫這個類。

有很好的文檔上how to write custom authentication provider - 這可能是你的靈感的起點;)