4

我想在 AccessDeniedException 的情况下自定义 Symfony2 的行为。如果引发异常的 HTTP 请求是 XMLHTTPRequest,那么我会回复一个 JSON,否则我会在登录页面生成 302。

这是我的实现。日志显示在 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_point向in提供服务security.yml确实解决了问题。

于 2012-08-25T11:50:30.117 回答