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

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

     session->set_userdata('username')

这将节省会话 - 我相信 - 一段时间

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

注意:$sess_expire将不起作用,因为它为所有用户设置了到期日期,我想做的是根据他的首选项设置到期日期

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

谢谢


答案 1

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

$cookie = array(
    'name'   => 'remember_me_token',
    'value'  => 'Random string',
    'expire' => '1209600',  // Two weeks
    'domain' => '.your_domain.com',
    'path'   => '/'
);

set_cookie($cookie);

您还可以将此随机字符串保存在表中,例如在列中。usersremember_me_token

现在,当用户(尚未登录)尝试访问需要身份验证的页面时:

  • 您检查其系统上是否有令牌名称的cookieremember_me
  • 如果存在,则检查数据库是否存在具有相同值的记录
  • 如果是这样,您将重新创建此用户的会话(这意味着他们已登录)
  • 显示他们正在访问的页面

如果不满足上述要求之一,请将其重定向到登录页面。

出于安全原因,您可能希望在每次用户登录时续订随机数。您还可以在每次用户登录时更新 Cookie 的到期日期。这样,他将保持登录状态。remember_me_token

为您编写所有代码将花费太多工作,但我希望这有助于您自己实现此功能。如果您有任何疑问,请发表评论。祝你好运。


答案 2

我需要同样的东西。您无法使用 CI 设置完成此操作,因此我选择重写 CI 会话类的 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标志。


推荐