3

我正在尝试为正在构建的 Yii 应用程序设置身份验证。我从演示应用程序开始,对样式、内容和我想使用的忘记密码/电子邮件确认方案进行了一些更改。

这在本地有效。问题是,当我推送到服务器时,我无法登录。我知道在对用户进行身份验证并存储会话或 cookie(取决于 main.php 的配置方式)之后对 login() 的调用已完成成功地。在用户被重定向之前,他们已经登录。但是,这不会在页面重定向中持续存在,例如 $this->redirect(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

4

1 回答 1

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',
),
于 2013-08-30T11:42:14.710 回答