我想在出现 AccessDeniedException 时自定义 Symfony2 的行为。 如果引发异常的 HTTP 请求是 XMLHTTPRequest,那么我会使用 JSON 进行回复,否则我会生成登录页面的 302 错误码。
这是我的实现。日志显示 AccessDeneidHandler 在 AccessDeniedException 之后永远不会被调用。我缺少什么?
#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'));
}
}
}
最佳答案
好吧,当我深入研究 ExceptionListener 时,终于发现了问题所在
仅当用户没有足够的权限访问资源时才会调用access_denied_handler
指向的服务。如果用户根本没有经过身份验证,则永远不会调用 access_dened_handler。
在 security.yml
中向 entry_point
提供服务确实解决了问题。
关于Symfony2 : why access_denied_handler doesn't work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11968354/