2012-07-25 3 views
6

Im CakePHP 2.2.1を使用していて、Auth Componentでユーザ認証を改善しようとしています。ユーザーが複数の場所からログインしようとすると、個々のセッションIDが取得されます。これは、古いセッションを強制終了して、複数の場所から同時にログインすることができないようにすることです。CakePHPチェックセッションがデータベースにあります

CakePHPがこのポストcakephp prevent user login from multiple locations at the same timeを使ってセッションを保存する方法を変換しましたが、新しいセッションが作成されたときに古いセッションを強制終了する方法についての回答はありませんでした。

私はセッションモデルを作成し、それを使ってレコードを選択することを考えましたが、安全なルートがあればわかりません。

また、Session ComponentとCakeSession DatasourceのCakePHPドキュメントを読んで、ヒントがあるかもしれないと思っていましたが、何かを見つけることができませんでした。

アドバイスをいただければ幸いです。

答えて

6

一般的に、セッション処理をデータベースに切り替える必要があるため、異なるユーザで同じユーザがログインしたことを検出したときに失効したセッションを削除することができます。session_id

Configure::write('Session.save', 'database'); 
  • あなたは、次を参照してくださいだろう

    cd app   
    Console/cake schema create Sessions 
    

    cake_sessionsテーブルを作成します

    1. スイッチセッションがデータベースに取り扱い:

      の手順は、あなたのアイデアを与えるために:

      あなたのセッションデータベースでdataフィールドを介して

      $this->Session->write('user_id', 123456); 
      
    2. 反復によってuser_idsession_idを結合して、同じuser_idがあなたのサイトに入り、異なるsession_idであればオフに行を削除すると仮定すると、

      Cake Schema Shell 
      --------------------------------------------------------------- 
      
      The following table(s) will be dropped. 
      cake_sessions 
      Are you sure you want to drop the table(s)? (y/n) 
      [n] > y 
      Dropping table(s). 
      cake_sessions updated. 
      
      The following table(s) will be created. 
      cake_sessions 
      Are you sure you want to create the table(s)? (y/n) 
      [y] > y 
      Creating table(s). 
      cake_sessions updated. 
      End create. 
      
    3. 残念ながら、CakePHPはdataserialize()のデータとして保存します。 cake_sessionsテーブルの各行を繰り返し処理して、dataに含まれるuser_idが一致するかどうかを検索して削除する必要があります。

      それとも、単にあなたのアイデアを与えるために、あなたは関連する行を削除するおおよそ方法については、以下のSQLを使用することができます。

      DELETE FROM `cake_sessions` WHERE `cake_sessions`.`data` LIKE '%123456%'; 
      
    4. をそのように古いsession_id意志を持っている古いユーザーログインしたユーザーとしてサイト上で続行することはできません。

  • +0

    基本的に、私はCakePHPのデフォルトのSessionComponentまたはAuthComponentでユーザーセッションを検出する方法はありませんか?前述のように、セッションがデータベースに書き込まれている時点で、ユーザを認証する前にレコードにアクセスしようとしていて、CakePHPがこれをサポートしているかどうか、またはあなたが指摘したように手動で行う必要があるかどうかはわかりませんDELETEクエリ – Dastca

    +0

    これは手動で行う必要があります。 CakePHPはこの機能を「そのまま」サポートしていません。 – uzyn

    +0

    ok、ありがとう、ありがとう、ありがとう – Dastca

    3

    これを行うもう1つの方法は、userテーブルにsession_idフィールドを作成し、ログイン後にユーザーの現在のセッションIDを保存することです。

    各ページで、session_idが現在のsession_idと等しくない場合は、すべてのセッションデータを削除し、ログインページにリダイレクトします。古いセッションデータまたは並行セッションのいずれかである必要があります。

    注:ユーザーテーブル内のセッションが現在のセッションであることを確認した後、セッションIDを再生成するときには、ユーザーテーブルのsession_idフィールドを更新することを忘れないようにするか、セッションが再生成されるたびにユーザーはログアウトされます。

    +0

    私はUzynsのソリューションが私のプロジェクトに合っていると思うが、私はこのソリューションを好む。これは、LIKEでデータを探している "醜い"クエリを使用することなく、はるかにクリーンでシンプルです。ありがとう – Dastca

    関連する問題