0

私はエレガントなクロスドメインセッション共有ソリューション(CakePHPコミュニティに喜んで投稿します)に非常に近いですが、それを完了するには最後の微調整が必​​要です。

CakeのネイティブDBに裏打ちされたセッション処理はかなり欠けているように見えますが、私はそれをハックするのは嫌です。サーバーA(データベースに存在する)からアクティブなセッションID(sid)を渡してから、そのID(およびデータはそのまま)でサーバーBで新しいセッションを開始することはサポートされていないようです。

これが私が得たところです:

Security = Lowに設定し、単一サーバーのログインなどをテストして、セッションが正常に動作していることを確認します。小切手。

サーバーAからサーバーBにsid文字列を正常に渡しました。サーバーBに...

CakeSession :: id($ sid_from_server_a)を実行します。

セッションDBテーブルのデータフィールドを解析し、$ this-> Session-> write('blah'、'value')を介してアクティブなセッションに配置します。

セッションを読み直して、セッションが「完了」したことを確認しました。

しかし、新しいページに移動すると、アクティブなsidは、他のページの読み込みと同じままであるまったく異なるsidにスナップバックします(サーバーAからsidを再確立するページを更新した場合でも)。

これはクッキーの問題ですか?

何をすべきかわかりませんが、Cakeパラダイム全体をバイパスします。Cakeの開発者は、複数のドメインの周りに既存のセッションを再確立するのに役立つセッション処理を設計しなかったようです。これがDBセッションハンドラーの主なメリットの1つだと思いました。

4

2 に答える 2

0

サーバー B で行う必要があったのは、セッションを適切に再初期化することだけでした。かなり基本的な:

session_write_close(); // close any session that has already initialized
CakeSession::id($sid_from_server_a); // or: session_id($sid_from_server_a);
session_start();

以前は、CakeSession ラッパーで新しい sid を設定すると、セッションの開始を促す 2 行目だけが必要だと思っていました。しかし、これは古い PHP の方法で session_id($some_sid) を実行することに似ています...実際にセッションを開始する前に、これを実行してセッションをセットアップできます。

一般に、CakePHP は必要なときに自動的にセッションを開始するという漠然とした考えがありましたが、実際に CakeSession クラスをスキャンすると、あまり機能しないことがわかります。これは、ネイティブ PHP セッション処理用の薄いベールに包まれた便利なラッパーです。

セッション DB テーブル内の疑似シリアル化されたセッション データを解析する必要さえありませんでした。上記のコードは、クロスドメイン セッション共有というトリックを実行します。

于 2012-08-28T05:06:00.270 に答える
0

これは Cookie の問題のように思えます。戻りたいセッション情報を保存するには Cookie が必要です。私の知る限り、この種のセッション情報を思い出す方法は他にありません。プロジェクトで保存する必要があるかどうかはわかりませんが、いくつかの情報がないと、サーバーはドメインをまたぐときに新しいセッションを作成するしかありません。幸運を。

于 2012-08-28T00:36:23.617 に答える