4

AccessDeniedException が発生した場合の Symfony2 の動作をカスタマイズしたい。例外を発生させた HTTP リクエストが XMLHTTPRequest の場合は、JSON で応答します。それ以外の場合は、ログイン ページに 302 found を生成します。

これが私の実装です。ログは、AccessDeniedException の後に AccessDeneidHandler が呼び出されないことを示しています。何が欠けていますか?

#security.yml
firewalls:
    secured_area:
        access_denied_handler: kernel.listener.access_denied.handler

#config.yml
kernel.listener.access_denied.handler:
   class: NoaLisa\Bundle\OVMBundle\DependencyInjection\AccessDeniedHandler
     tags:
        - { name: kernel.event_listener, event: security.kernel_response, method: handle}

#AccessDeniedHandler

class AccessDeniedHandler implements AccessDeniedHandlerInterface{

function handle(Request $request, AccessDeniedException $accessDeniedException){

    if ($request->isXmlHttpRequest()) {
        $response = new Response(json_encode(array('status' => 'protected')));
        return $response;
    }
    else {
        return new RedirectResponse($this->router->generate('login'));
    }
}
}
4

1 に答える 1

8

ついに、ExceptionListenerを掘り下げたときに何が問題だったのかがわかりました。

が指すサービスはaccess_denied_handler、ユーザーがリソースにアクセスするための十分な権限を持っていない場合にのみ呼び出されます。ユーザーがまったく認証されていない場合、access_dened_handlerは呼び出されません。

にサービスを提供することentry_pointsecurity.yml実際に問題を解決しました。

于 2012-08-25T11:50:30.117 に答える