我尝试用我自己的cookie创建一个登录系统。关键是每次用户登录并勾选"remember me"按钮时,它都会生成一个新的32个字符的cookie,并将其保存在用户表中,列名为"remember_me_token"。如果用户关闭浏览器并返回,它应该自动为他/她再次登录,但我似乎没有得到它的工作。
如果我现在关闭浏览器,再打开它并回到我的网站,cookie仍然在那里。问题是,每次会话到期(为了测试目的,我将其设置为1分钟),它将自动注销我,并完全忽略cookie。我的方法或数据库查询是否有问题?
提前感谢!
这是我的模型:
public function checkRememberMeToken($cookie)
{
$where = array (
'remember_me_token' => $cookie
);
$this->db->select('*')->from('users')->where($where);
$query = $this->db->get();
if($query->num_rows() == 1) {
return true;
}
}
这是我的控制器:
public function loginWithCookie()
{
if($cookie = $this->input->cookie('sportietown')) {
$user = $this->user_model->checkRememberMeToken($cookie);
if($user === TRUE)
{
$this->session->set_userdata('user_id', $user['user_id']);
$this->session->set_userdata('email', $user['email']);
$this->session->set_userdata('name', $user['name']);
$this->session->set_userdata('profilepic', $user['profilepic']);
redirect(base_url().'dashboard');
} else {
$this->load->view('/template/header');
$this->load->view('index');
$this->load->view('/template/footer');
}
}
}
设置的cookie和会话时间一起工作。会话的时间是指用户可以将浏览器闲置或再次返回而仍能被识别的时间。
当用户进入新页面并读取cookie时,如果会话处于活动状态,则会话时间重新开始。如果你把它设置为1分钟,除非他们快速点击,否则它不会起作用。CI中的默认值是2小时(7200秒),或者将其设置为您想要的值。
CI config/config.php中的从第235行开始是所有会话配置。确保它们设置正确,并确保您的cookie名称中没有下划线。
由于要使用table进行用户自动登录,因此需要保存用户的useragent字符串。格式是
Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1
每次用户使用同一设备访问时,使用此标识,然后登录。
表应该是这样的:user_id
, useragent