我正在为我的网站构建一个身份验证系统,并实现我使用会话库
session->set_userdata('username')
这将保存会话 - 我相信 - 一段时间
我想在登录表单中提供“记住我”复选框,以便用户可以永久保存会话 - 找不到永久保存会话的方法!?
注意: $ sess_expiration不起作用,因为它为所有用户设置了截止日期,我想要做的是根据他的偏好设置截止日期
可能吗?以及如何做到这一点?
由于
答案 0 :(得分:61)
如果选中了“记住我”复选框,则使用随机字符串在用户系统上设置cookie。 E.g:
$cookie = array(
'name' => 'remember_me_token',
'value' => 'Random string',
'expire' => '1209600', // Two weeks
'domain' => '.your_domain.com',
'path' => '/'
);
set_cookie($cookie);
您还可以将此随机字符串保存在users
表中,例如在remember_me_token
列中。
现在,当用户(尚未登录)尝试访问需要身份验证的页面时:
remember_me
令牌的Cookie 如果未满足上述要求之一,则将其重定向到登录页面。
出于安全原因,您可能希望每次用户登录时都续订随机remember_me_token
。您还可以在每次用户登录时更新Cookie的到期日期。这样他就会保持登录状态。
为您编写所有代码会有太多工作,但我希望这可以帮助您自己实现此功能。如果您有任何疑问,请发表评论。祝你好运。
答案 1 :(得分:6)
我需要同样的事情。您无法使用CI设置完成此操作,因此我选择覆盖CI Session类的setcookie方法(在MY_Session中):
function _set_cookie($cookie_data = NULL)
{
if (is_null($cookie_data))
{
$cookie_data = $this->userdata;
}
// Serialize the userdata for the cookie
$cookie_data = $this->_serialize($cookie_data);
if ($this->sess_encrypt_cookie == TRUE)
{
$cookie_data = $this->CI->encrypt->encode($cookie_data);
}
else
{
// if encryption is not used, we provide an md5 hash to prevent userside tampering
$cookie_data = $cookie_data.md5($cookie_data.$this->encryption_key);
}
setcookie(
$this->sess_cookie_name,
$cookie_data,
$this->userdata('rememberme') == true ? $this->sess_expiration + time() : 0,
$this->cookie_path,
$this->cookie_domain,
0
);
}
当然,您需要根据用户的选择在会话中设置rememberme标志。
答案 2 :(得分:2)
您可以使用isset检查cookie是否有值,如果cookie被删除,它将返回负数。如果它是否定的,你可以再次设置cookie ...当然,这将是"更新" cookie,所以如果用户没有到期,他们将被遗忘。 (设定一个非常大的时间,直到期满!)
例如:
<?php
if (isset($_COOKIE['autologin'])) { //Checks for cookie
echo "Welcome back!... Logging you in.";
}else{ //Sets a cookie
echo "Please sign in";
$expiretime=time()+60*60*24*365; //set expire time to a year
setcookie("autologin", "What is here is not important.", $expiretime);
};
?>
答案 3 :(得分:2)
我用钩子来做这个
在“config.php”设置中启用挂钩$config['enable_hooks'] = TRUE;
在登录控制器中保存会话
上的复选框值$this->session->set_userdata('remember_me', $this->input->post('remember_me'));
在您的“hooks.php”文件中添加此
$hook['post_controller_constructor'] = array(
'class' => 'Change_Config',
'function' => 'change_session_expiration',
'filename' => 'change_config.php',
'filepath' => 'hooks'
);
在“hooks”文件夹中创建名为“change_config.php”的文件并粘贴此
<?php
class Change_Config {
public function change_session_expiration() {
$ci = & get_instance();
$remember = $ci->session->userdata('remember_me');
if($remember && $ci->session->sess_expire_on_close) {
$new_expiration = (60*60*24*365); //A year milliseconds
$ci->config->set_item('sess_expiration', $new_expiration);
$ci->config->set_item('sess_expire_on_close', FALSE);
$ci->session->sess_expiration = $new_expiration;
$ci->session->sess_expire_on_close = FALSE;
}
}
}
答案 4 :(得分:1)
$this->session->sess_expiration = '14400'; // expires in 4 hours
$this->session->set_userdata($data); // set session
答案 5 :(得分:1)
你可以放这个
if ($remember) {
$new_expiration = (60*60*24*365);
$this->config->set_item('sess_expiration', $new_expiration);
$this->config->set_item('sess_expire_on_close', FALSE);
$this->session->sess_expiration = $new_expiration;
$this->session->sess_expire_on_close = FALSE;
}
答案 6 :(得分:0)
您可以将sess_expiration设置为0,然后将自定义变量设置为会话,例如remember_me = 1。检查此值并在一段时间后根据需要销毁会话。 这将是一个工作场所。