所有。
我正在使用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;