Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何创建;“记住我”复选框;使用Codeigniter会话库?_Php_Session_Authentication_Codeigniter_Cookies - Fatal编程技术网

Php 如何创建;“记住我”复选框;使用Codeigniter会话库?

Php 如何创建;“记住我”复选框;使用Codeigniter会话库?,php,session,authentication,codeigniter,cookies,Php,Session,Authentication,Codeigniter,Cookies,在Codeigniter中,我正在为我的网站构建一个身份验证系统,并使用会话库来实现这一点 session->set_userdata('username') 我相信,这将为会议节省一段时间 我想在登录表单中提供一个“记住我”复选框,以便用户可以永久保存会话-找不到永久保存会话的方法 注意:$sess\u过期将不起作用,因为它为所有用户设置过期日期,而我要做的是根据他的偏好设置过期日期 可能吗?怎么做呢 谢谢您可以将sess\u expiration设置为0,然后在会话中设置一

在Codeigniter中,我正在为我的网站构建一个身份验证系统,并使用会话库来实现这一点

     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;
    
    }