CodeIgniter会话和userdata

时间:2014-06-17 22:24:06

标签: php codeigniter session

所有。
我正在使用CodeIgniter(2.0.3)和Tank_Auth 我在登录时将一些userdata设置到会话中,我的配置被设置为保存在数据库中 我将CI_controller类(MY_controller)子类化,因此在构造函数中我检查用户是否已登录。这样,每个后代控制器都无法被未经授权访问。
我还将Session类子类化为修复重新生成会话和AJAX问题(http://ellislab.com/forums/viewthread/138823/
根据我的配置,会话到期时间为7200秒(2小时),再生时间为5分钟(300秒) 问题如下:

  • 用户A登录。生成会话并将其与相应的用户数据一起保存在数据库中。

  • 用户A保持登录但未提出任何请求(例如,他/她离开浏览器并离开)

  • 用户B在两小时后登录。

  • 用户A的会话到期(7200秒),会话库的构造函数(由用户B发出的请求调用)从数据库中删除用户A会话,

    $this->_sess_gc(); // Line number 122 of /system/libraries/session.php
    

(同样的情况是由会话过期引起的,因为会话类函数sess_destroy从数据库中删除它,但我相信这个行动方针使得这一点更清楚,并且也是一个真实的我已经跟踪)

  • 用户A返回并向服务器发出AJAX请求。在该请求中,MY_controller构造函数检查用户是否已记录

    if (!$this->tank_auth->is_logged_in())
    

为此,它首先加载会话库,而会话库又调用Session类构造函数,在第106行中说:

    if ( ! $this->sess_read())
    {
        $this->sess_create();
    }
    else
    {
        $this->sess_update();
    }

- 创建了一个新会话,但没有用户数据,因此此后依赖于该数据的所有内容都开始失败。但是is_logged_in()函数仍然返回true。所以我无法察觉它。

我认为它是一个非常天真的失败,所以它不能在CI或tank_auth或会话类上,而是在我自己的逻辑中。但是经过几个小时的搜索/挖掘/调试,找不到线索 任何人都可以在我的逻辑中查明错误吗? 我粘贴我的配置(会话相关部分)和MY_controller子类 谢谢你的帮助。

MY_Controller

class MY_Controller extends CI_Controller
{
function __construct()
    {
    parent::__construct();

    $this->load->model('tank_auth/users');
    $this->load->helper('url');
    $this->load->library('tank_auth');
    if (!$this->tank_auth->is_logged_in())
        {
        header('Location:'. site_url('login_controller'));
        }
    }
}

配置

$config['sess_cookie_name']     = 'ci_session';
$config['sess_expiration']      = 7200;
$config['sess_expire_on_close'] = TRUE;
$config['sess_encrypt_cookie']  = TRUE;
$config['sess_use_database']    = TRUE;
$config['sess_table_name']      = 'ci_sessions';
$config['sess_match_ip']        = FALSE;
$config['sess_match_useragent'] = FALSE;
$config['sess_time_to_update']  = 300;

0 个答案:

没有答案