3

FOSRestBundleを使用するWebサービスでは、ログインでアプリケーションにアクセスするように強制するファイアウォールを作成しました。

私の問題は、ajaxを介してAPIを呼び出すときに、ログインフォームのhtmlソースコードを受け取るのではなく、ユーザーが認証されていないときにエラーコード401を取得する必要があることです。アプリケーションを構成するにはどうすればよいですか?

secured_area:
            pattern:    ^/
            form_login:
                provider: fos_userbundle
                use_forward: false
                default_target_path: /w
            logout:
                path:   /logout
                target: /login

編集:

Ryanのおかげで、ここにKernelExceptionListenerメソッドがあります。

public function onKernelException( GetResponseForExceptionEvent $event ) {
    // get exception
    $exception = $event->getException();
    // get path
    $path = $event->getRequest()->getPathInfo();

    if ( $exception instanceOf AuthenticationException && ($event->getRequest()->isXmlHttpRequest() || strpos( $path, '/api' ) === 0) ) {
        $response = new Response();
        $response->setStatusCode( 401 );
        $event->setResponse( $response );
        $event->stopPropagation();
    }
}
4

1 に答える 1

2

承認ではなく認証という言葉を使用しましたが、残念ながらこれはまだ書かれていないようです。したがって、おそらく独自に作成する必要があります。

一般的なケースでは、 AuthenticationException例外をインターセプトするための単純なカーネルイベントリスナーを作成する必要があります。このイベントをキャプチャすると、ログインページにリダイレクトする前に任意のアクションを実行できるようになります。

FOSRestBundleは、これを行う方法の良い例を提供するはずです。FOSRestBundleは、現在、認証レイヤーにこの機能を提供しています(AccessDeniedException)。少し変更を加えるだけで、同じフレームワークが認証レイヤーにも同じことを行う機能を提供するはずです。

許可リスナーを提供する変更セットについては、プル#308を参照してください。リスナーの構成方法については、セキュリティ例外リスナーを参照してください。

于 2013-03-26T18:11:52.687 に答える