web-dev-qa-db-ja.com

Code Igniterで特定のセッションを破棄する

スタッフ注:この質問と関連する回答は、現在のイベントを取り巻くトピックの議論を避けるためにロックされています それは手近な質問に関連しています。質問このイベントについては、メタサイト で見つけることができます。ありがとうございました!

Code Igniterに組み込まれたアプリからユーザーをログアウトできるようにしたい。

アクティブなローカルセッションを終了する方法を知っています。

$this->session->sess_destroy();

しかし、別のコンピューターで開始されたセッションを破棄して、セッションからユーザーをログアウトするにはどうすればよいですか?

アカウントに関連付けられた一意のIDをセッションデータに保存するため、データベースのセッションテーブルで確認できますが、他のセッションデータとともにuser_dataという列に保存され、その内容は次のようになりますこの:

a:4:
{s:9:"user_data";s:0:"";s:6:"userid";s:6:"189034";s:9:"logged_in";b:1;s:5:"token";i:1767727789;}

ここで、189034はユーザーのIDです。

だから、何らかの方法でユーザーのIDに基づいてセッションテーブルの行を選択し、行を削除してセッションを破棄する方法があります。または、これを完全に行う別の方法はありますか?

43
frosty

Ci_sessionテーブルに新しい列を作成します。

ALTER TABLE `yourdatabase`.`ci_sessions` 
ADD COLUMN `userid` VARCHAR(45) NULL  AFTER `user_data` ;

次に、ログイン関数でログインプロセスからIDを取得し、ユーザーデータ情報をセッションに追加する前に次の操作を行います。

/* Delete any existing sessions with the current userid session.
Note - a new session has already been generated but doesn't have a value
in the userid column, so won't get deleted. */
$this->db->delete('ci_sessions',array('userid' => $identity));    

// Get the current session and update it with the userid value.
$session_id = $this->session->userdata('session_id');
$this->db->where('session_id', $session_id);
$this->db->update('ci_sessions', array('userid' => $identity));

どこ$identityはユーザーIDです。これにより、以前のセッションがすべてクリアされ、一度に1つのセッションのみが存在することになります。

31
Stevo

あなたが望むいくつかのアイテム/セッションを破壊する機能があります

$this->session->unset_userdata('session_name')

また、1人のユーザーが一度に1台のコンピューターまたは1つのブラウザーにログインできるようにするには、こちらをご覧ください。

一度に1つのセッションのみ許可

4
Hieu Van Mach

シリアル化されたデータの問題の1つは、それを照会する正当な方法がないことです。セッション内のすべてのユーザー(lotの可能性があります)を取得し、データを解凍して値を確認し、セッションテーブルの行を削除して、そのセッションを効果的に破棄する必要があります。

foreach ($this->db->get('sessions')->result() as $session)
{
    $data = unserialize($session->user_data);

    if ( ! isset($data['user_id'])) continue;

    if ($data['user_id'] === $id_to_delete)
    {
        // delete the row
            $this->db->where('session_id', $session->session_id)
                ->delete('sessions');
    }
}

私はおそらくこれを落胆させるでしょう。ログインしているかどうかに関係なく、サイトのすべてのユーザーは、選択する必要があるセッションを持ちます。1人のユーザーが複数のセッションを持っている可能性があるため、すべてのセッションを繰り返す必要があります。

別のアプローチは、ユーザーID(またはIDのハッシュ)を使用してセッションテーブルにカスタム列を追加することです。ユーザーのセッションをすばやく見つけるために照会できるもの。次に、user_idをセッションに追加すると、この列にデータが入力され、user_idでセッションを削除する必要がある場合は、迅速かつ効率的に実行できます。

3
Wesley Murch