2013-07-03 19 views
3

我正在嘗試爲我正在構建的Yii應用程序設置身份驗證。我從演示應用程序開始,對風格,內容以及我想要使用的忘記密碼/電子郵件確認方案進行了一些更改。Yii登錄不能在遠程部署後工作

這適用於本地。問題是,當我推送到服務器時,我無法登錄。我知道,根據配置main.php的方式,在對用戶進行身份驗證並存儲會話或cookie之後對login()進行的調用完成成功。在用戶重定向之前,他們已登錄。但是,這不會在整個頁面重定向過程中持續,例如, $ this->重定向(Yii :: app() - > user-> returnUrl)

actionLogout()方法永遠不會被調用,並且我已經嘗試啓用和禁用基於cookie的身份驗證,應用程序的行爲。

因爲它在本地工作,所以我非常確定問題出在我的服務器配置上。但是我看不到它,因爲我的phpinfo顯示會話已啓用。

有沒有人有關於這個問題可能在這裏的想法?我將附加main.php,SiteController.php和phpinfo的輸出。

main.php - http://pastebin.com/LR4i6vYZ

SiteController.php - http://pastebin.com/Fgm1a1nV

的phpinfo - http://pastebin.com/CDE2WqvK

+0

此問題已解決。我將cookie的TTL值從0改爲了一個很大的數字值,這應該使cookie無限期地持續下去。這應該不成功,但它確實。我將向Yii提交一份錯誤報告。我希望這篇文章能夠幫助其他人解決同樣的問題。 –

+0

您不應該設置會話cookie一段時間,它應該在用戶關閉瀏覽器窗口時到期。對於持久登錄使用「記住我」功能。 – 2013-07-03 09:39:38

+0

當然,你是對的,但是這需要將TTL設置爲0.哪一個不起作用。這就是爲什麼我問這個問題。 –

回答

3

我在這個確切同樣的問題,已經找到了問題的原因(至少在我的實例)。如上所述,設置Cookie的TTL值不是一個好主意,因爲這基本上等同於強制「記住我」,但用戶不知道你已經完成了它 - 不安全。

我遇到的問題是,雖然登錄在本地部署到活動服務器時正常工作,但只有在設置「記住我」後才能工作,這基本上將Yii切換到基於cookie的驗證而不是基於會話的驗證(因爲你不會選擇「記住我」)。

問題是在我的遠程服務器上Yii無法寫入默認的PHP會話路徑(它能夠在我的本地機器上這樣做,但在遠程服務器上用戶帳戶自然更加鎖定,那麼)。

我通過在web根目錄之外創建會話文件夾,然後將其設置爲yii配置文件中會話的保存路徑來解決此問題。

保護>>配置>> main.php

'components'=>array(
    ... 
    'session' => array (
     'savePath' => 'pathToSessionsFolder', 
    ), 
    ... 
), 

的Yii現在應該能夠正確書寫的會話信息。帶有會話ID的Cookie始終在客戶端上正確設置,但現在Yii應該能夠將它與服務器上寫入的會話信息進行匹配,然後才能保存它。

另一種解決方案是通過Yii設置中的數據庫以相同的方式打開會話管理(Yii應創建表,如果它不存在)。

'session' => array (
    'class' => 'CDbHttpSession', 
    'connectionID' => 'db', 
    'sessionTableName' => 'table_name', 
), 
+1

比其他方法更受歡迎嗎?我將保存會話信息到數據庫去了,因爲我不需要給Apache目錄寫入權限。我猜數據庫方法可能會慢一點? –