首页 文章

使用CodeIgniter登录和会话

提问于
浏览
2

我对登录系统比较陌生 . CodeIgniter可以在数据库中存储会话,这就是我正在做的事情 . 它存储基本知识:session_id,ip,agent和last_activity以及存储自定义数据的选项 . 我已经阅读了一些教程,根据我的理解,它应该如何工作:

  • 检查用户是否存在会话(这是否必要?)

  • 检查会话数据库中的用户名(如果它不存在,这将是会话数据库中的自定义条目),然后显示登录表单 . (并在登录后将用户名保存到会话数据库)

  • 如果会话数据库中存在用户名,请检查last_activity . 如果它比期望的要早(或者如果会话已过期),则显示登录表单 . 如果它不是太旧,请登录 .

  • 要注销,您只需从会话数据库中删除用户名 . (或者我应该使用: $this->session->sess_destroy()

那有意义吗?我是否还应该在会话数据库中存储用户的加密密码并检查它?有更好/不同的方式吗?

谢谢 .

4 回答

  • 7

    我认为你的方法进入了一个稍微错误的方向,但它根本没有错 . 你应该把它分开一点 .

    会话实际上做的是存储多个请求所需的数据 .

    CodeIgniter中的会话表与用户信息无关 . 它仅负责存储会话相关数据(session_id等) . 设置完表后,您就可以使用CodeIgniter Sessions了 . 它将为您处理会话管理过程 .

    所以让我们通过登录过程 .

    首先,您需要一个用于存储用户信息的表 . 该表的最简约实现将是:

    users(user_id, username, password)
    

    我在会话中存储的唯一信息是用户ID . 因此,每当用户进入您的页面时,您应该检查是否存在具有您的用户ID的会话字段 .

    if($this->session->userdata('user_id'))
    {
      //User is logged in
    }
    else
    {
      //User is not logged in
    }
    

    如果用户未登录,则需要显示登录表单 . 用户发送表单后,您需要验证输入并检查登录尝试是否成功 . 您的模型方法可能如下所示

    public function attemptLogin($username, $password)
    {
      $query = $this->db->get_where('users', array(
        'username' => $username,
        'password' => $this->mysecurityclass->superDuperHashMethod($password)
      ));
      if($query->num_rows() == 0)
        return false;
      return $query->row()->user_id;
    }
    

    我们在这里做的是检查是否存在与用户输入匹配的数据集 . 正如你所说,我提供了一个简单的例子,说明如何进行散列 . 当然,您需要自己实现散列功能或使用任何现成的类 . 由你决定 . 也许你应该更多地封装它并且已经将散列密码传递给方法 .

    如果输入的凭据与users表中的数据集匹配,则该方法将返回用户ID . 我们知道用户已成功登录 . 获得用户ID后,将其存储在会话中 .

    $userid = $this->user_model->attemptLogin($username, $pass);
    if(!$userid)
    {
      //GTFO, login was not successfull
    }
    else
    {
      $this->session->set_userdata('user_id', $userid);
      redirect('home');
    }
    

    因此,当登录成功时,您可以设置会话密钥并重定向用户 . 现在这个过程又开始了 . 但现在我们有一个会话集,我们的初始检查是否会通过会话字段集 . 我们的用户已登录 .

    要记录用户,您只需要像您已经提到的那样简单地销毁会话 . 由于会话密钥user_id将不再设置,之后我们的初始检查将返回false,并且将再次提示用户登录表单 .

    正如你看到的 . 您不必关心如何在内部处理会话 . 如果有什么不清楚,请随时询问 .

    note: 代码示例仅用于说明目的 . 你需要自己考虑实现:)

    快乐的编码!

  • 1

    请看我的评论:

    1.检查用户是否存在会话(这是否必要?)

    Comments :是的,这是必要的,因为它告诉特定用户是否登录,并且可以基于此进行一些活动 . 如果登录则重定向到主页,否则返回登录/注册页面

    2.检查会话数据库中的用户名(如果它不存在,这将是会话数据库中的自定义条目),然后显示登录表单 . (并在登录后将用户名保存到会话数据库)

    Comments :见上述评论 .

    3.如果会话数据库中存在用户名,请检查last_activity . 如果它比期望的要早(或者如果会话已过期),则显示登录表单 . 如果它不是太旧,请登录 .

    Comments :您可以根据自己的要求修改此功能 .

    4.要注销,您只需从会话数据库中删除用户名 . (或者我应该使用:$ this-> session-> sess_destroy()) .

    Comments :你需要从db中删除它 .

    默认情况下,CodeIgniter将会话数据存储在cookie中,根据浏览器的不同,cookie的大小上限为2KB-4KB . 如果您尝试在会话中存储超过4KB的数据,您将开始遇到问题 .

    您可以在此处获取更多信息:详细博客:http://goo.gl/YPllj0

  • 2

    由您和您的要求决定,您是否要在 database 中存储 user information .

    • 当用户登录并突然或假设他关闭浏览器时,默认情况下他应该是 logged-in .

    • 是的,如果您没有 session-id 用户,那么您可以向他显示 login-form . session-id entry 也应该在 logout 之后删除 .

    • 您可以 delete 全部 old entries ,并显示 login-form .

    • logout 之后你应该 clear the session 以及 remove the database entry. codeigniter 已存储的一件事 session in cookies 阅读session,所以检查 cookies 是否也已清除 . 为此您可以使用 Codeigniter native session library from here

  • 0

    会话数组的一个有用方面是您可以将自己的数据添加到它,它将存储在用户的cookie中 . 你为什么想做这个?这是一个例子:

    假设某个特定用户登录您的网站 . 经过身份验证后,您可以将他们的用户名和电子邮件地址添加到会话cookie中,使您可以全局使用该数据,而无需在需要时运行数据库查询 .

    要将数据添加到会话数组,需要将包含新数据的数组传递给此函数:

    $this->session->set_userdata($array);
    

    其中$ array是包含新数据的关联数组 . 这是一个例子:

    $newdata = array(
        'username'  => 'johndoe',
                   'email'     => 'johndoe@some-site.com',
                   'logged_in' => TRUE
               );
    
    $this->session->set_userdata($newdata);
    

    如果要一次添加userdata一个值,set_userdata()也支持此语法 .

    $this->session->set_userdata('some_name', 'some_value');
    

相关问题