2008/06/24 22:10 katarou <mail.hiro...@gmail.com>:
> 少し間が開きましたが、Authentcationのリダイレクトで条件が確認できました。
> 私の場合は
>
> - name: Interceptor_Authentication
> point:
> - name: url
> type: configuration
> value: "http://example.org/authenticate.php"
> - name: resources
> type: configuration
> value:
> - "/index.php"
> - "/input/Edit.php"
> とした場合に、http://example.org/input/Edit.phpにアクセスし、ログインを行った後に
> 下記'MenuFromprocChecklogin'へ遷移してしまうようです。
認証が完了するまでに最短で 3 回のリクエストが発生することになりますが、
その間の Interceptor_Authentication プラグインの動作は下記のようになり
ます。
1. /input/Edit.php へのリクエスト => URI を保存する
2. /autenticate.php へのリクエスト => 保護リソースでないため何も行わない
3. /autenticate.php へのリクエスト => 保護リソースでないため何も行わない
1 回目のリクエストの際に保存された URI はこの流れの中で削除されること
はありません。
また、3 回目のリクエストの際に
$authentication->redirectToCallbackURL() のコールによって
Piece_Unity_Context::setView() がコールされ保存された URI がビューとし
て設定されることになります。Dispatcher_Continuation プラグインから返さ
れるビューは、Piece_Unity_Context::getView() が null でない場合は使用
されません。(Dispatcher_Controller プラグイン)
このような仕様のため、$authentication->redirectToCallbackURL() をコー
ルした場合も、しなかった場合も、
> return 'MenuFromprocChecklogin'; //通常ここへはこない?
に到達するのは問題ありません。
さて、頂いた情報をもとにテストケースを書いてみましたが、再現させること
ができませんでした。詳しい調査のために下記のコードを、
return 'MenuFromprocChecklogin' の前に挿入し、エラーログを確認いただけないでしょうか?
require_once 'Piece/Unity/Service/Authentication/State.php';
$authenticationState = &Piece_Unity_Service_Authentication_State::singleton();
error_log(var_export($authenticationState->hasCallbackURL(null), true));
error_log(var_export($authenticationState->getCallbackURL(null), true));
hasCallbackURL() が true であっても getCallbackURL() が null であれば
リダイレクションされないことになります。
--
KUBO Atsuhiro e-mail: ku...@iteman.jp
2008/06/26 22:24 katarou <mail.hiro...@gmail.com>:
> ログの書き出し場所がわからなかったので、画面に表示したところ
> false
> NULL
> と表示されています。
その結果からは URL が保存されていないか null が設定されていることにな
りますが、原因としては下記が考えられます。
1. URL が一度も保存されていない
2. URL が保存されたあと削除された
3. URL が null として保存されている
原因の特定には最初のリクエストから 3 回目のリクエストまでの
Interceptor_Authentication プラグインの内部の動きを追う必要がありそう
です。
> コードを見ていてふと気がついたのですが、入り口PHPで
> ini_set('session.cookie_path', str_replace('\\', '/',
> dirname($_SERVER['SCRIPT_NAME'])));
> session_save_path("$base/sessions");
> の記述を行っているのですが、階層が変わっても同じ記述をした場合問題はあるでしょうか?
> 少し、試してみます。
はい、階層が異なればそれに合わせた内容を設定する必要があります。
Apache であれば VirtualHost ディレクティブなどで固定値を設定し、コード
からは削除しておくといいと思います。
しかし、これらは今回の現象とは関係なさそうです。
サンプルのエントリポイントで最も問題が起こりやすいのは
Configurator_AppRoot プラグインの設定ポイント appRoot ですが、この値も
エントリポイントで設定する場合はディレクトリ階層に合わせる必要がありま
す。これも上記と同じように piece-unity-config.yaml で固定値を記述する、
あるいは共通のファイルに移動するといいと思います。
念のため基にされた Piece_Examples_Basics や
Piece_Unity_Component_Authentication, Piece_Unity などのバージョンを教
えていただけないでしょうか。