1

authenticationで実行されているアプリケーションのプロセスを書き直していますZF2

呼び出されるサービスに応じて、ユーザーを認証するためのオプションがさらに必要です。

ブラウザからアクセスする Web アプリケーションの IE では Ldap 経由で認証し、API サービスではヘッダーのユーザー認証情報をチェックします。

abstract controllerユーザーが認証されているかどうかのチェックを作成しました。そうでない場合は、ログイン ページにリダイレクトされます。

同じ認証プロセスを必要とするモジュール内のすべてのコントローラーは、このクラスを拡張します。

ログインに成功した後、元のリクエストを保存して元のリクエストにリダイレクトする必要があります。

私の質問は次のとおりです。

1. 抽象コントローラ -> onDispatch() メソッドは、配置するのに適切な場所ですか?

私が周りで見つけたすべての解決策は、常にModule.php. Module.php は常に呼び出されるため、auth メソッドを区別するには、要求されたコントローラーが一致するかどうかを確認する必要があります。コントローラーにセットした方が「すっきり」しませんか?

2. リダイレクトまたはフォワードを使用して、元のコントローラーからログイン コントローラーに渡してから戻す必要がありますか?

元のリクエストも維持しながら、最善かつ最速のソリューションを探しているだけで、ブラウザ バーで URL が変更されてもかまいません。

3. URI をセッション クラス (認証モジュールから) に保存するのは正しいですか? リクエスト全体 (必要に応じて POST データを含む) を保存する方法はありますか?

抽象コントローラーは次のとおりです。

abstract class AbstractAuthActionController extends AbstractActionController {

    public function onDispatch(MvcEvent $e) {
        $serviceManager = $e->getApplication ()->getServiceManager ();
        $auth = $serviceManager->get ( 'LdapAuth\Client\Ldap' );
            if (! $auth->hasIdentity ()) {
                $uri = $e->getRequest()->getRequestUri();
                $callBackFunction = $this->getLdap ()->getCallBackFunction (); // = new SessionData();
                $callBackFunction::setOriginalUri($uri); // function to store temporarly the uri
                return $this->redirect ()->toRoute ( 'ldap-login-route' );
        } else {
            return parent::onDispatch ( $e );
        }
    }
}
4

1 に答える 1

0
  1. dispatch多くの人は、コントローラーイベントの前に認証のチェックを行いたいため、これを行います。認証は、routeイベント時など、プロセスのかなり早い段階で、または少なくともコントローラーがインスタンス化される前に確認できます (コントローラーよりも優先度の高いディスパッチ)。

    ユーザーが認証されていない場合は、できるだけ早く401(未承認) または403(禁止) または302(一時的に移動された) 応答 (このステータス コードの詳細については、こちらの Wikiを参照してください) を使用して、すべてのオーバーヘッドを回避する必要があります。サーバーが (不必要に) 占有されたままになるため、アプリケーションの速度が低下し、認証されていない応答が遅れます。

    module.php関連するすべてのコードを追加するのに最適な場所ではありません。authentication認証リスナーを作成し(そしてリスナーに認証サービスを注入し)、リスナーのみを に接続することをお勧めしますmodule.php

  2. リダイレクトと転送の違いについては、こちらの回答をご覧ください。authenticatedステータス コードを含む応答で正しくないことをクライアントにリダイレクトする場合は302、このステータス コードを含むリダイレクト応答を送信する必要があります。そのような場合に forward を使用している人もいますが、クライアントはリダイレクトについて通知されないため、私の意見では正しくありません。認証モジュールをチェックZfcUserして、これをどのように処理するかを確認することもできます。

  3. この URL をサーバーに保存する必要はありません。ログイン後に移動したい URL (元の URL) をリダイレクト応答内で送信できます。たとえば、 をlogin.phpターゲットとするリクエストからにリダイレクトするprofile.php場合、リダイレクト URL は次のようになります。

    http://www.example.com/login.php?redirect=profile.php

    ログイン プロセス/コントローラ内でリダイレクトを設定できるようになりました。これにより、ログインが成功した後にクライアントを に戻すことができますprofile.php

于 2016-05-24T08:30:29.410 に答える