1

私が求めているものに関連する投稿はたくさんありますが、長い検索を行っても探しているものが見つからなかったため、どこかに存在する場合はお詫びします。

私の目標-Zendアプリへのすべてのリクエストは、preDispatchプラグインを経由してから、既存の認証クレデンシャルがリクエストされた操作に十分かどうかを判断するカスタム認証コントローラーに渡す必要があります。「十分」はアプリのロジックに依存するため、コントローラー+モデルレベルでこれを実行したいのはなぜですか。それらが十分である場合、それらは元の要求を指定されたコントローラー+アクションに沿って送信します。そうでない場合、デフォルトで「失われる」アクションになります。

現在、preDispatchで設定されたauthカスタムプラグインを使用して、POSTされた認証クレデンシャルをチェックするだけです(ログインしている場合)。その後、すべての場合、プラグインは元のリクエストを保存し、全員をリダイレクトします(認証されているかどうかは関係ありません)。 )私の認証コントローラーに、a-la:

$request->setModuleName('default')
            ->setControllerName('auth')
            ->setActionName('check')
            ->setParam('oreq',$request->getParams());

私の問題/質問は、auth-> checkアクション内で、決定が行われた後にリダイレクトをどのように実行する必要があるかということです。私が使用する場合:

$this->_helper->redirector($or['action'], $oreq['controller']);

次に、これらのリクエストがpreDispatchプラグインを再び通過するときに、明らかに無限ループが発生します。確かに、Authプラグインがそのような要求を無視するように、リダイレクトで何かを渡すことができますが、これは明らかにセキュリティホールです。md5ハッシュを生成して保存し、それをセッションに保存して、それをエスケープパラメータとして渡すことを考えていましたが、それは少し大雑把に思えます。

そこにもっと良いアイデアはありますか?おそらく、Zend Appの標準の事前ディスパッチルーチンを通過しないリダイレクトメソッドですか?前もって感謝します!

4

1 に答える 1

0

これは、ZendFrameworkで通常行われる方法ではありません。すべてのリクエストが共通の場所に送信され、元のリクエストされた場所の認証にリダイレクトされるわけではありません。

アクセス制御には、Zend_Aclを使用します。これにより、現在のユーザーがコンテンツにアクセスするために必要な認証を持っているかどうかを簡単に判断できます。そうでない場合は、「迷子になる」アクションにリダイレクトします。

それでもテクニックを使用することに固執する場合は、redirectメソッドの代わりに_forwardメソッドを使用してください。

は内部リダイレクトであるため_forward、ループを回避するために、追加の引数を渡し、preDispathでそれを確認できます。

$this->_forward($action, $controller, $module, $params)
于 2011-12-22T17:21:56.310 に答える