使用CodeIgniter登录和会话

Man*_*nju 2 php session codeigniter

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

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

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

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

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

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

谢谢.

thp*_*hpl 7

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

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

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

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

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

users(user_id, username, password)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

如果输入的凭据与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');
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

快乐的编码!