异常呈现 symfony html 错误页面而不是 JSON 响应
Exception render symfony html error page instead of JSON response
我有一个应用程序 运行 Symfony5
和 ApiPlatform
使用 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()
它对我有用,它没有解决问题,但在我的情况下是一个可以接受的修复
我有一个应用程序 运行 Symfony5
和 ApiPlatform
使用 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()
它对我有用,它没有解决问题,但在我的情况下是一个可以接受的修复