6

私はCakePHP 2.2.1を使用しており、認証コンポーネントを使用してユーザー認証を改善しようとしています。ユーザーが複数の場所からログインしようとすると、個々のセッション ID が取得されます。古いセッションを強制終了して、ユーザーが複数の場所から同時にログインできないようにします。

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

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

セッション コンポーネントと CakeSession データソースに関する CakePHP のドキュメントも読みましたが、ヒントがあるかもしれませんが、何も見つかりませんでした。

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

4

2 に答える 2

6

通常、セッション処理をデータベースに切り替えて、同じユーザーが別の でログインしたことを検出したときに古いセッションを削除できるようにしますsession_id

アイデアを提供するための手順:

  1. セッション処理をデータベースに切り替える

    Configure::write('Session.save', 'database');
    
  2. cake_sessionsテーブルを作成

    cd app         
    Console/cake schema create Sessions
    

    次に、次のように表示されます。

    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. にバインドすると仮定session_iduser_idます

    $this->Session->write('user_id', 123456);
    
  4. dataセッション データベースのフィールドを反復処理し、同じものuser_idがサイトに入り、異なるsession_id.

    残念ながら、CakePHP は-ed データdataとして保存します。tableserialize()の各行を反復処理して、seralizedに含まれる一致を検索して削除する必要があります。cake_sessionsuser_iddata

    または、アイデアを提供するために、次の SQL をおおよその方法として使用して、関連する行を削除することができます。

    DELETE FROM `cake_sessions` WHERE `cake_sessions`.`data` LIKE '%123456%';
    
  5. そうすれば、古いユーザーを持つ古いユーザーはsession_id、ログインしたユーザーとしてサイトを続行できなくなります。

于 2012-07-25T15:31:32.877 に答える
3

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

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

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

于 2012-07-25T19:45:52.637 に答える