代码之家  ›  专栏  ›  技术社区  ›  ahmed

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

  •  23
  • ahmed  · 技术社区  · 14 年前

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

         session->set_userdata('username')
    

    我相信,这样可以节省一段时间的时间。

    我想在登录表单中提供一个“记住我”复选框,这样用户就可以永远保存会话-找不到永久保存会话的方法!?

    注: $sess撊expiration将不起作用,因为它为所有用户设置了到期日期,我要做的是根据他的偏好设置到期日期。

    有可能吗?怎么做呢?

    谢谢

    7 回复  |  直到 6 年前
        1
  •  60
  •   Mischa    14 年前

    如果选中“记住我”复选框,则在用户系统上设置一个随机字符串的cookie。例如。:

    $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的到期日期。这样他就可以保持登录。

    为您编写所有代码可能会有太多的工作,但我希望这能帮助您自己实现这个功能。如果您有任何问题,请发表评论。祝你好运。

        2
  •  6
  •   Fer    14 年前

    我也需要同样的东西。使用CI设置无法完成此操作,因此我已选择重写CI会话类的setcookie方法(在我的会话中):

    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标志。

        3
  •  2
  •   San Bergam    11 年前

    您可以使用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);
         };
    ?>
    
        4
  •  2
  •   Danilo Colasso    9 年前

    我用钩子做这个

    1. 在“config.php”设置中启用挂钩 $config['enable_hooks'] = TRUE;

    2. 在登录控制器中,在会话中保存复选框值

      $this->session->set_userdata('remember_me', $this->input->post('remember_me'));
      
    3. 在你的“hooks.php”中 文件 添加此

      $hook['post_controller_constructor'] = array(
          'class'     => 'Change_Config',
          'function'  => 'change_session_expiration',
          'filename'  => 'change_config.php',
          'filepath'  => 'hooks'
      );
      
    4. 在你的“钩子”里 文件夹 创建一个名为“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;
              }
          }
      }
      
        5
  •  1
  •   Puffin GDI sanjeev    11 年前
    $this->session->sess_expiration = '14400';    // expires in 4 hours
    $this->session->set_userdata($data);          // set session
    
        6
  •  1
  •   Triyugi Narayan Mani Harendra Kumar    6 年前

    你可以把这个

    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;
    
    }
    
        7
  •  0
  •   Herr    14 年前

    您可以将sess-expiration设置为0,然后在会话中设置自定义变量,例如,remember-me=1。检查该值并在一段时间后根据需要销毁会话。 这将是一个工作场所。