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

ahm*_*med 24 php authentication cookies session codeigniter

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

     session->set_userdata('username')
Run Code Online (Sandbox Code Playgroud)

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

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

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

那可能吗?怎么做?

谢谢

Mis*_*cha 62

如果选中"记住我"复选框,则使用随机字符串在用户的系统上设置cookie.例如:

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

set_cookie($cookie);
Run Code Online (Sandbox Code Playgroud)

您还可以在users表中保存此随机字符串,例如在列中remember_me_token.

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

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

如果未满足上述要求之一,则将其重定向到登录页面.

出于安全原因,您可能希望remember_me_token每次用户登录时都更新随机.您还可以在每次用户登录时更新cookie的到期日期.这样他就会保持登录状态.

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

  • @Priyanga,不,不应该.从[用户指南](http://ellislab.com/codeigniter/user-guide/libraries/input.html):"到期时间设置为秒,将添加到当前时间." (3认同)
  • @Priyanga,我猜你正在使用PHP的[`setcookie`](http://php.net/manual/en/function.setcookie.php)而不是CodeIgniter的`set_cookie`. (2认同)
  • 这种方法存在问题,如果用户使用2个设备(或浏览器),则令牌将随每次登录而改变,从而使其他设备无效.您必须使用另一个表来记录每个用户的所有有效自动登录令牌,并且无法知道应该转储哪些令牌. (2认同)

Fer*_*Fer 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
            );

}
Run Code Online (Sandbox Code Playgroud)

当然,您需要根据用户的选择在会话中设置rememberme标志.