【问题标题】:Yii users being logged out after 15-30 minutes despite session timeouts being set to at least 1 dayYii 用户在 15-30 分钟后退出,尽管会话超时设置为至少 1 天
【发布时间】:2012-10-03 06:50:06
【问题描述】:

我在下面包含了我们 Yii 配置文件的相关部分:

return array(
...
    'components'=>array(
        'session' => array(
            'timeout' => 86400,
        ),
        'user'=>array(
            'allowAutoLogin' => true,
            'autoRenewCookie' => true,
            'authTimeout' => 31557600,
        ),
    ...
    ),
...
);

我也进入了 php.ini 并设置了session.gc_maxlifetime = 86400,但这仍然没有解决问题。

目前,我完全不知道还有什么可能导致它在大约 15-30 分钟不活动后超时并注销用户。理想情况下,用户应保持登录状态至少一天不活动(在关闭浏览器窗口后,允许浏览器首选项)。

我搜索了谷歌、Yii 和堆栈溢出,但找不到任何我忽略的东西……但显然我忽略了一些东西。如果有人能帮助我,我将不胜感激。


请求了我们用来登录用户的典型代码示例,包含在下面:

$identity = new UserIdentity('facebook', $id, $user->name, $user->email);
$loggedIn = Yii::app()->user->login($identity);
$this->subscriptionChecker->updateCurrentUserSubscribed();

这是任何时候调用Yii::app()->user->login() 的典型情况


在 Chrome 中,这是我拥有的网站 cookie 及其到期时间(在清除所有 cookie 并登录后):

PHPSESSID expires When the browsing session ends

// I'm informed these are set by google analytics  
__utma created Friday, 12 October 2012 14:05:31 expires Sunday, 12 October 2014 14:05:31

__utmb created Friday 12 October 2012 14:05:31 expires Friday 12 October 2012 14:35:31,

__utmc created Friday, 12 October 2012 14:05:31 expires When the browsing session ends

__utmz created Friday 12 October 2012 14:05:31 expires Saturday 13 April 2013 02:05:31  
// end google analytics

【问题讨论】:

  • 检查是否使用 Yii::app()->user->login 方法设置会话时间?
  • 我认为你如何登录你的用户在这里很重要,你能展示一下这段代码吗?
  • 还尝试在数据库中维护会话(仅用于测试)并查看“过期”时间是多少?
  • 检查发送到浏览器的会话cookie,确保它不会提前过期。
  • 还检查执行 $loggedIn = Yii::app()->user->login($identity, 86400); 时会发生什么;

标签: php session cookies yii session-timeout


【解决方案1】:

http://www.yiiframework.com/doc/api/1.1/CWebUser#login-detail

感谢 Arfeen 的帮助,他为我指明了正确的方向,除非你设置 Yii::app()->user->login() 的第二个参数,否则 Yii 不会使用持久 cookie,因为第二个参数默认为 0。这个默认 0- value 会覆盖您可能设置的与超时有关的任何其他内容。

【讨论】:

  • 是的,这就是我要求检查它的原因。但是您是否检查过您从 yii 应用用户的 isGuest 属性中获得了什么价值?无论如何欢迎:)
  • 是的,isGuest 属性工作正常,我们非常广泛地使用它。
【解决方案2】:

我遇到了同样的问题,即使我将 authTimeout 设为 3600 * 24(24 小时),用户仍会在大约 30 分钟后注销。 我发现在 php.ini 上有一个选项:

session.gc_maxlifetime

默认此选项为 24 分钟,所以我根据需要进行了更改

session.gc_maxlifetime = 86400

24 小时。为我解决了问题。

希望这可以帮助某人!

【讨论】:

    【解决方案3】:

    试试这个: 第一 当您登录时,您可以设置 setState 这个:

    yii::app()->user->setState('userSessionTimeout', time() + Yii::app()->params['sessionTimeoutSeconds']); 
    

    添加这些是文本 companents.controller.php

     public function beforeAction(){
                // Check only when the user is logged in
                if ( !Yii::app()->user->isGuest)  {
                   if ( yii::app()->user->getState('userSessionTimeout') < time() ) {
                       // timeout
                       Yii::app()->user->logout();
                       $this->redirect(array('/site/login'));  //
                   } else {
                       yii::app()->user->setState('userSessionTimeout', time() + Yii::app()->params['sessionTimeoutSeconds']) ;
                       return true; 
                   }
                } else {
                    return true;
                }
            }
    

    并将它们添加到配置 main.php 文件中:

    'params'=>array('sessionTimeoutSeconds'=>1800, // 30 分钟),

    【讨论】:

      【解决方案4】:

      对于 Yii2

      此解决方案在登录会话 cookie 后将过期时间设置为 7 天后:

      'components' => [
          'session' => [
              'class' => 'yii\web\Session',
              'cookieParams' => ['lifetime' => 7 * 24 *60 * 60]
          ],
      

      【讨论】:

        【解决方案5】:

        适用于 Yii2 版本

        在您的 /config/params.php 中以秒为单位设置超时:

        'sessionTimeoutSeconds' => '1800',
        

        在你的控制器/SiteController.php actionLogin() 方法中添加以下内容:

        // Set the user session timeout
        Yii::$app->session->set('userSessionTimeout', time() + Yii::$app->params['sessionTimeoutSeconds']);
        

        还要在 SiteController.php 中添加 beforeAction 方法

        public function beforeAction($action)
        {
        
            if (!parent::beforeAction($action)) {
                return false;
            }
        
            // Check only when the user is logged in
            if ( !Yii::$app->user->isGuest)  {
                if (Yii::$app->session['userSessionTimeout'] < time()) {
                    Yii::$app->user->logout();
                } else {
                    Yii::$app->session->set('userSessionTimeout', time() + Yii::$app->params['sessionTimeoutSeconds']);
                    return true; 
                }
            } else {
                return true;
            }
        }
        

        在您的views/layouts/main.php:在头部DOM之间添加自动刷新标题以将应用程序发送回登录视图。

        <? if (!Yii::$app->user->isGuest) { ?>
                    <meta http-equiv="refresh" content="<?php echo Yii::$app->params['sessionTimeoutSeconds'];?>;"/>
        <? } ?>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-07-22
          • 2011-10-18
          • 2018-05-15
          • 2013-06-05
          • 1970-01-01
          • 2013-04-19
          相关资源
          最近更新 更多