2013-07-03 20 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目录写入权限。我猜数据库方法可能会慢一点? –