0

私は Symfony 1.4 アプリを使用していますが、ユーザーがアプリケーションに複数回ログインできないようにする必要があります。つまり、S/He が既にログインしている場合、新しいアプリを開くだけでログインできないはずです。ブラウザ。

  • ユーザーは Chrome にログインします。
  • Firefox を開き、ログインを試みますが、Chrome でセッションが既にアクティブであるため、ログインできません。

同じユーザーが同じコンピューターまたは別のコンピューターで別のブラウザーを使用して別のセッションを開始するのを避けたいです。

4

2 に答える 2

1

私が考える唯一の解決策は、MySQL(またはデータベース)でセッションを使用し、特定のユーザーに対してセッションがアクティブであるかどうかを確認して、ログインできるかどうかを確認することです。

簡単な部分ではないでしょう。私は一度それをしましたが、ソースコードが見つかりません..だから私はあなたがしなければならないことを説明します.

  1. sfPDOSessionStorageセッションを db に保存するには、アクティブ化する必要があります (このブログ投稿に従うことができます) 。
  2. sfPDOSessionStorage次に、セッション テーブルにさらにフィールドを追加できるように拡張するカスタム ストレージを作成します。

    次のように、内に新しいフィールド (たとえばsess_user_id) が作成されます。factories.yml

    all:
      storage:
        class: myCustomPDOSessionStorage
        param:
          db_table:       session
          database:       propel
    
          db_id_col:      sess_id
          db_data_col:    sess_data
          db_time_col:    sess_time
          db_user_id_col: sess_user_id
    
  3. sessionReadメソッド&sessionWriteをカスタム セッション ストレージから次のように更新する必要があります。

    • 新しいフィールド (user_id) による挿入/更新
    • user_id が既に存在し、セッション時間が問題ないかどうかを確認します。そうでない場合は、例外をスローします。問題に関するメッセージを表示するには、ユーザーのログイン時にこの例外をキャッチする必要があります。
于 2013-01-15T10:08:50.313 に答える
1

次のように呼び出して、ユーザーがログインしているかどうかを確認できます。

sfContext::getInstance()->getUser()->isAuthenticated()

またはアクション内で:

$this->getUser()->isAuthenticated()

だから、あなたは次のようなものが欲しいと思います:

public function executeLogin($request)
{
    if ($this->getUser()->isAuthenticated()) {
        // redirect or whatever
        // $this->redirect(...);
    } else {
        // login user properly
    }
}
于 2013-01-14T17:47:34.757 に答える