Symfony2 : why access_denied_handler doesn't work

标签 symfony exception

我想在出现 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/

相关文章:

symfony - 用于登录 Symfony 4 的多个提供商和防火墙

php - Symfony 找不到 "GET/logout"的路由

mongodb - 使用 Doctrine 和 MongoDB 存储数组

android - Google Analytics tracker.enable Exception Reporting(true) 不在logcat中显示异常

java - 查找最大元素时线程 "main"java.lang.ArrayIndexOutOfBoundsException 中出现异常

python - 我是否必须在 Python 中引发 ValueError

symfony - JMS 序列化器注释组不使用 Symfony 4 在实体上工作

php - 正在创建无效的 Doctrine 实体

java - 在 Java Web 服务中引发用户定义的异常时出现错误

c# - 如何避免异常该进程无法访问该文件,因为它正被另一个进程使用。在.net