php - 使用 CodeIgniter 登录和 session

标签 php codeigniter session

我对登录系统比较陌生。 CodeIgniter 可以将 session 存储在数据库中,而这正是我正在做的。它存储基础知识:session_id、ip、agent 和 last_activity 以及存储自定义数据的选项。我已经阅读了一些教程,据我了解,它应该如何工作:

  1. 检查用户是否存在 session (是否有必要?)

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

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

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

这有意义吗?我还应该将用户的加密密码存储在 session 数据库中并进行检查吗?有更好/不同的方法吗?

谢谢。

最佳答案

我认为您的方法有点错误,但一点也没错。 你应该把它分开一点。

session 实际上做的是存储多个请求所需的数据。

您在 CodeIgniter 中的 session 表与用户信息无关。它只负责存储session相关的数据(session_id等)。一旦你设置了表格,你就可以像你习惯的那样使用 CodeIgniter Sessions。它将为您处理 session 管理过程。

那么让我们来看看登录过程。

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

users(user_id, username, password)

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

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;
}

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

如果输入的凭据与用户表中的数据集匹配,该方法将返回用户 ID。我们知道此时用户已经成功登录。获得用户 ID 后,将其存储在您的 session 中。

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

因此,当登录成功时,您设置 session key 并重定向用户。现在这个过程又开始了。但是现在我们有一个 session 集,如果我们有 session 字段集,我们的初始检查将通过。我们的用户已登录。

要注销用户,您只需像您已经提到的那样简单地销毁 session 。由于 session key user_id 将不再设置,因此我们的初始检查将返回 false,用户将再次被提示进入登录表单。

如你所见。您不必关心 session 是如何在内部处理的。如果有什么不清楚的地方,请随时询问。

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

编码愉快!

关于php - 使用 CodeIgniter 登录和 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18011501/

相关文章:

php - Php Drupal 规则代码中的 SQL 错误 - 限制每天的投票数

security - 是所有类型的 cookie 都已签名,因此无法更改,还是 Play 中只有 session cookie?

php session 安全查询

php - 使用 Recess 处理 session !

php - 连接两个表并获取最新的 slug

php - 存储过程在后台执行?

php - Laravel 5.2 登录不工作

php - 查询不适用于 LIKE

php - codeigniter 不同的 mysql 查询

php - Codeigniter 替换上传的图片