あなたのアプローチは少し間違った方向に進んでいると思いますが、まったく間違っていません。もう少し分けたほうがいい。
セッションが実際に行うことは、複数のリクエストに必要なデータを保存することです。
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;
}
ここで行っているのは、ユーザー入力に一致するデータセットがあるかどうかを確認することです。あなたが尋ねたように、ハッシュを行う方法の簡単な例を提供しました。もちろん、ハッシュ機能を自分で実装するか、すぐに使用できるクラスを使用する必要があります。それはあなた次第です。おそらく、それをさらにカプセル化して、ハッシュ化されたパスワードをメソッドに渡す必要があります。
入力された資格情報が 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 が返され、ユーザーは再度ログイン フォームに移動するよう求められます。
ご覧のとおり。セッションが内部でどのように処理されるかを気にする必要はありません。ご不明な点がございましたらお気軽にお尋ねください。
注:コード例は説明のみを目的としています。自分で実装を考える必要があります:)
ハッピーコーディング!