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

时间:2010-10-21 04:36:40

标签: php session authentication codeigniter cookies

Codeigniter中的

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

     session->set_userdata('username')

这将保存会话 - 我相信 - 一段时间

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

注意: $ sess_expiration不起作用,因为它为所有用户设置了截止日期,我想要做的是根据他的偏好设置截止日期

可能吗?以及如何做到这一点?

由于

7 个答案:

答案 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)

我用钩子来做这个

  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. 在“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。检查此值并在一段时间后根据需要销毁会话。 这将是一个工作场所。