Symfony2:为什么access_denied_handler不起作用

que*_*ito 4 exception-handling symfony

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

这是我的实施.该日志显示在AccessDeniedException之后永远不会调用AccessDeneidHandler.我错过了什么?

#security.yml
firewalls:
    secured_area:
        access_denied_handler: kernel.listener.access_denied.handler
Run Code Online (Sandbox Code Playgroud)

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

#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'));
    }
}
}
Run Code Online (Sandbox Code Playgroud)

que*_*ito 8

好吧,最后我发现在挖掘ExceptionListener时出现了什么问题

access_denied_handler仅当用户没有足够的权限访问资源时,才会调用指向的服务.如果用户未经过身份验证,则永远不会调用access_dened_handler.

提供服务以entry_pointsecurity.yml没有真正解决问题.

  • 对于那些在这里找不到这个答案的人来说,这是一个布局的解决方案:http://stackoverflow.com/questions/17428987/what-is-the-best-way-to-notify-a-user-after-an-access-控制规则重定向/ 17432089#17432089 (7认同)