3

サブドメイン/ドメインの 1 つのサービスのユーザーが残りのサービスに一度にログインできるようにしたい。

これは私の構造です:

  • /図書館
    • /アプリ1
      • 構成
      • モジュール
      • ブートストラップ
    • /app2
      • 構成
      • モジュール
      • ブートストラップ
    • /app3
      • 構成
      • モジュール
      • ブートストラップ

ドメイン

  • アプリ 1: example.com
  • アプリ 2: app2.example.com
  • アプリ 3: app3.example.com

それらはすべて、アカウント、セッションなど
に1つのデータベースを使用しています。誰かがアプリの1つに入り、IPをデータベースに保存するときに、Session_Db_Adpaterを機能させようとしました。
次に、彼が別のスクリプトを入力すると(その別のスクリプトで)、テーブルにレコードがあるかどうかを確認し、ある場合、スクリプトはそのレコードに対してアクティブなセッションを作成するか、新しいレコードを作成しないかどうかを確認します。


試行 1: session_data を古い ID から新しい ID に単純に更新しようとしましたが、$db->update() が true を返すにもかかわらず、session_data は更新を拒否します。

試行 2 Session_SaveHandler_DbTable をオフにしてこれを試しました。最終的には同じドメインにあるためです。

  Zend_Session::setOptions(array('cookie_domain' => '.example.com'));
    Zend_Session::start();

まだ何もありません。

試行 3 Zend_Session::setId(); を使用しました。

    $db = Zend_Registry::get('users_db');    
    $test = $db->select()->from('session')->where('ip = ?', $_SERVER['REMOTE_ADDR']);
    $row = $db->fetchRow($test);
    if($row) {            
        Zend_Session::setId($row['session_id']);
    } else {
        Zend_Session::start();
        $db->update('session', array('ip'=>$_SERVER['REMOTE_ADDR']), 'session_id = "'. Zend_Session::getId() .'"');
    }

そして、2〜5分間動作し、次のエラーがスローされます:セッションはすでに開始されています。最初にセッション ID を設定する必要があります。

たとえば app3.example.com で入力すると、セッションがデータベースに行を挿入しないことに気付きました。いくつかのテスト クエリを確認して動作するため、アダプタは正常に動作しています。

私は次のような SessionHandler 構成を入れました:

    $config = array(
        'db' => Zend_Registry::get('users_db') ,  //or alone 'main_db' 

構成の残りの部分は、参考としてデフォルトです。

助けてください。

4

2 に答える 2

2

Zend から何も設定する必要はありません。php.ini ファイルに次のように設定するだけです

; The path for which the cookie is valid.
session.cookie_path = /

; The domain for which the cookie is valid.
session.cookie_domain =

サブドメインのすべてのアプリケーションは、メイン アプリケーションから作成された同じ SESSION ID にアクセスでき、その逆も同様です。

于 2011-06-25T11:05:31.673 に答える
2
        if(isset($_COOKIE['session_id']))
            session_id($_COOKIE['session_id']);
        Zend_Session::start(); //or session_start();
        if(!isset($_COOKIE['session_id']))
            setcookie('session_id', session_id(), 0, '/', '.yourdomain.com');
于 2012-02-24T16:19:28.400 に答える