异常呈现 symfony html 错误页面而不是 JSON 响应

Posted

技术标签:

【中文标题】异常呈现 symfony html 错误页面而不是 JSON 响应【英文标题】:Exception render symfony html error page instead of JSON response 【发布时间】:2021-09-01 23:58:34 【问题描述】:

我有一个使用JWTSymfony5ApiPlatform 一起运行的应用程序,我希望某些用户在某些情况下无法登录

所以我有一个听众 LoginListener 如下:

public function onAuthenticationSuccess(AuthenticationSuccessEvent $event)

        $user = $event->getUser();
        if ($user->someCondition)                
          throw new MyAccessDeniedException(json_encode('Ce compte n\'est plus actif.'));
        

使用的异常类只是:

<?php

namespace App\Exception;

use Symfony\Component\Security\Core\Exception\AccessDeniedException;

class MyAccessDeniedException extends AccessDeniedException



我在不同的情况下经常使用这个异常抛出 403,包括在其他一些侦听器中。

这里的问题是,它不是返回一个json格式的异常,前端很容易使用,而是从symfony返回一个html页面异常。

例如,这是我试图返回的问题,而不是 HTML:

"@context":"\/contexts\/Error","@type":"hydra:Error","hydra:title":"An error occurred","hydra:description":"Some error message","trace":["namespace":"","short_class":"","class":"",.....

有谁知道为什么,在这个特殊的异常中,异常的渲染结果是 HTML 而不是 JSON?如果有解决此问题的方法?

谢谢!

【问题讨论】:

您是在开发模式还是产品模式下运行?如果您处于启用调试栏的开发模式,那么我认为 Symfony 会将错误呈现为 HTML。在 prod 模式下,它们应该以 JSON 形式返回。 抱歉,回复晚了,我在开发中,但触发了多个异常,(完全相同的异常)与这个相比,在 json 中正确呈现 【参考方案1】:

由于我无法弄清楚返回 HTML 的原因,因为在其他地方触发的相同异常确实返回了预期的 JSON,所以我尝试触发其他异常,例如 badRequestException() 它对我有用,它不能解决问题,但在我的情况下是可以接受的解决方法

【讨论】:

【参考方案2】:

您可能想要创建一个AccessDeniedHandler。见Symfony docs

您可以使用以下内容创建您的回复:

return new JsonResponse($event->getMessage(), 403); 
// in your example, getMessage() returns your encoded error

或者,如果您有多个不同的AccessDeniedException,您可以使用AccessDeniedListener。见Symfony docs

【讨论】:

感谢您的评论并对迟到的回复感到抱歉,我尝试返回一个 JsonResponse() 但它让用户连接并且不会像我想要的那样阻止他。我找到了另一个修复程序,可以完成工作

以上是关于异常呈现 symfony html 错误页面而不是 JSON 响应的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 Redis Validator,字符串而不是ClassMetadata

为啥升级到 Symfony 4.4 后我不再看到错误预览页面?

处理所有异常并显示自定义错误页面而不是默认框架错误页面

jquery post返回呈现的html页面而不是sql结果

启用异常控制器时自定义错误页面不起作用

在视图之外使用 symfony 布局