2

私はログインシステムに比較的慣れていません。CodeIgniter はセッションをデータベースに保存できます。それが私が行っていることです。カスタムデータを保存するオプションを使用して、session_id、ip、agent、および last_activity の基本を保存します。私はいくつかのチュートリアルを読みましたが、私が理解していることから、これがどのように機能するかです:

  1. ユーザーのセッションが存在するかどうかを確認します (これは必要ですか?)

  2. セッション データベースでユーザー名を確認し (これはセッション データベースのカスタム エントリになります)、存在しない場合は、ログイン フォームを表示します。(そしてログイン後、ユーザー名をセッションデータベースに保存します)

  3. ユーザー名がセッション データベースに存在する場合は、last_activity を確認します。必要以上に古い場合 (またはセッションの有効期限が切れている場合) は、ログイン フォームを表示します。古すぎない場合は、ログインしてください。

  4. ログアウトするには、セッション データベースからユーザー名を削除するだけです。(または、使用する必要があります: $this->session->sess_destroy())

それは理にかなっていますか?ユーザーの暗号化されたパスワードもセッションデータベースに保存し、それも確認する必要がありますか? より良い/別の方法はありますか?

ありがとう。

4

4 に答える 4

7

あなたのアプローチは少し間違った方向に進んでいると思いますが、まったく間違っていません。もう少し分けたほうがいい。

セッションが実際に行うことは、複数のリクエストに必要なデータを保存することです。

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 が返され、ユーザーは再度ログイン フォームに移動するよう求められます。

ご覧のとおり。セッションが内部でどのように処理されるかを気にする必要はありません。ご不明な点がございましたらお気軽にお尋ねください。

注:コード例は説明のみを目的としています。自分で実装を考える必要があります:)

ハッピーコーディング!

于 2013-08-02T08:11:15.907 に答える