异常呈现 symfony html 错误页面而不是 JSON 响应
Posted
技术标签:
【中文标题】异常呈现 symfony html 错误页面而不是 JSON 响应【英文标题】:Exception render symfony html error page instead of JSON response 【发布时间】:2021-09-01 23:58:34 【问题描述】:我有一个使用JWT
与Symfony5
和ApiPlatform
一起运行的应用程序,我希望某些用户在某些情况下无法登录
所以我有一个听众 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 后我不再看到错误预览页面?