Php 如何创建;“记住我”复选框;使用Codeigniter会话库?
在Codeigniter中,我正在为我的网站构建一个身份验证系统,并使用会话库来实现这一点Php 如何创建;“记住我”复选框;使用Codeigniter会话库?,php,session,authentication,codeigniter,cookies,Php,Session,Authentication,Codeigniter,Cookies,在Codeigniter中,我正在为我的网站构建一个身份验证系统,并使用会话库来实现这一点 session->set_userdata('username') 我相信,这将为会议节省一段时间 我想在登录表单中提供一个“记住我”复选框,以便用户可以永久保存会话-找不到永久保存会话的方法 注意:$sess\u过期将不起作用,因为它为所有用户设置过期日期,而我要做的是根据他的偏好设置过期日期 可能吗?怎么做呢 谢谢您可以将sess\u expiration设置为0,然后在会话中设置一
session->set_userdata('username')
我相信,这将为会议节省一段时间
我想在登录表单中提供一个“记住我”复选框,以便用户可以永久保存会话-找不到永久保存会话的方法
注意:$sess\u过期将不起作用,因为它为所有用户设置过期日期,而我要做的是根据他的偏好设置过期日期
可能吗?怎么做呢
谢谢您可以将sess\u expiration设置为0,然后在会话中设置一个自定义变量,如memory\u me=1。检查此值并在一段时间后销毁会话(如果需要)。
这将是一个工作区。如果选中“记住我”复选框,则在用户系统上使用随机字符串设置cookie。例如:
$cookie = array(
'name' => 'remember_me_token',
'value' => 'Random string',
'expire' => '1209600', // Two weeks
'domain' => '.your_domain.com',
'path' => '/'
);
set_cookie($cookie);
您还可以将此随机字符串保存在users
表中,例如在memory\u me\u token
列中
现在,当用户(尚未登录)尝试访问需要身份验证的页面时:
- 您检查他的系统上是否有名为
记住我
令牌的cookie
- 如果存在,则检查数据库中是否存在具有相同值的记录
- 如果是,则重新创建此用户的会话(这意味着他们已登录)
- 显示他们正在访问的页面
记住\u me\u令牌。您还可以在用户每次登录时更新cookie的过期日期。这样他将保持登录状态
要为您编写所有的代码将是太多的工作,但我希望这有助于您自己实现此功能。如果您有任何问题,请发表评论。祝你好运。我也需要同样的东西。您无法使用CI设置完成此操作,因此我已选择覆盖CI会话类(在我的会话中)的setcookie方法:
当然,您需要根据用户的选择在会话中设置rememberme标志。您可以使用isset检查cookie是否有值,如果cookie被删除,它将返回负值。如果为负数,您可以再次设置cookie。。。当然,这就像“更新”cookie一样,因此如果用户在到期时没有来,他们将被忘记。(设定一个非常长的时间直到到期!)
$this->session->sess_expiration = '14400'; // expires in 4 hours
$this->session->set_userdata($data); // set session
例如:
<?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);
};
?>
我用钩子来做这件事
在“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\u 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;
}
}
}
你可以把这个
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;
}
非常好和安全的回答。荣誉'expire'=>1209600应该是'expire'=>time()+1209600.@Priyanga,不应该。“过期时间以秒为单位设置,将添加到当前时间。”@Priyanga,我猜您使用的是PHP而不是CodeIgniter的set_cookie
。这种方法有一个问题,如果用户使用两台设备(或浏览器),每次登录时令牌都会发生变化,从而使另一台设备失效。您必须使用另一个表来记录每个用户的所有有效自动登录令牌,并且无法知道应该转储哪些令牌。如果使用这种方法,您必须在每个页面重新加载时设置sess\u expiration
,否则您必须在使用set\u userdata()甚至set\u flashdata()的任何位置显式设置它。这是因为cookie将被您在配置中设置的内容覆盖。如果您使用的是数据库会话,则无法使用此解决方案,因为垃圾收集器使用sess_过期来清理会话表。因此,未选择“记住我”的用户将导致删除所有(按其标准)过期的会话。同样,如下所示:如果您使用的是数据库会话,则无法使用此解决方案,因为垃圾收集器使用sess_过期来清理会话表。因此,未选择“记住我”的用户将导致删除所有(按其标准)过期的会话。您可以使用具有此功能且与框架无关的会话。那么如何检查记住我是否已过期?
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;
}