我认为你的方法正在走向一个稍微错误的方向,但它根本没有错。你应该把它分开一点。
会话的实际作用是存储多个请求所需的数据。
CodeIgniter 中的会话表与用户信息无关。它只负责存储会话相关数据(session_id 等)。设置好表格后,您可以按照习惯使用 CodeIgniter 会话。它将为您处理会话管理过程。
那么让我们来看看登录的过程。
首先,您需要一个存储用户信息的表。该表的最简约的实现是:
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;
}
我们在这里所做的是检查是否存在与用户输入匹配的数据集。正如你所问的,我提供了一个简单的例子,如何进行散列。当然,您需要自己实现散列功能或使用任何现成的类。由你决定。也许您甚至应该更多地封装它并且已经将散列密码传递给该方法。
如果输入的凭据与用户表中的数据集匹配,该方法将返回用户 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,并且将再次提示用户进入登录表单。
正如你看到的。您不必关心会话是如何在内部处理的。随意询问是否有不清楚的地方。
注意:代码示例仅用于说明目的。您需要自己考虑实施:)
快乐编码!