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

Exception render symfony html error page instead of JSON response

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

所以我有一个监听器 LoginListener 如下:

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

使用的异常 class 只是 :

<?php

namespace App\Exception;

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

class MyAccessDeniedException extends AccessDeniedException
{
}

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

这里的问题是,return 不是 json 格式下的异常,前端很容易使用,它 return 是 html 页面异常来自 symfony。

例如,这是我正在尝试解决的问题 return,而不是 HTML :

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

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

谢谢!

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

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

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

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

因为我无法弄清楚为什么 HTML 被 returned,因为在其他地方触发的相同异常确实 return 预期的 JSON,我试过了触发其他异常,例如 badRequestException() 它对我有用,它没有解决问题,但在我的情况下是一个可以接受的修复