APIPlatform:激活exception_to_status参数时,UserCheck的AccessDeniedException似乎未捕获异常

时间:2019-06-05 06:02:40

标签: symfony4 api-platform.com

我使用API​​Platform v2.4。 我实现了JWT身份验证,并且一切正常。 但是我想添加一个登录名:如果用户处于非活动状态,我想阻止访问,所以我根据synfony Cookbook使用UserCheck:

https://symfony.com/doc/current/security/user_checkers.html

所以我创建了一个AccessDeniedException,它工作正常。

use Symfony\Component\Finder\Exception\AccessDeniedException;
use Symfony\Component\Security\Core\Exception\AccountStatusException;
use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;

use Symfony\Component\Security\Core\User\UserCheckerInterface;
use Symfony\Component\Security\Core\User\UserInterface;

class UserChecker implements UserCheckerInterface
{
    public function checkPreAuth(UserInterface $user)
    {
        if (!$user instanceof AppUser) {
            return;
        }
    }

    public function checkPostAuth(UserInterface $user)
    {
        if (!$user instanceof AppUser) {
            return;
        }

        if ($user->getIsActive() == false) {
            throw new AccessDeniedException('Inactive account');
        }
    }

但是,我想像apiplatform文档中一样,在404错误中转换此AccessDeniedException:

https://api-platform.com/docs/core/errors/#errors-handling

因此,我将此配置设置添加到我的api_platform.yaml中:

error_formats:
    jsonproblem: ['application/problem+json']
exception_to_status:
    Symfony\Component\Finder\Exception\AccessDeniedException: 400

但是无事可做...当我尝试登录我的应用程序时,我遇到了HTML错误:

<html>
    <head>
        <meta charset="UTF-8" />
        <meta name="robots" content="noindex,nofollow" />
        <meta name="viewport" content="width=device-width,initial-scale=1" />
        <title>    Inactive account (500 Internal Server Error)
</title>

有人有类似的问题吗?

感谢您的阅读,

2 个答案:

答案 0 :(得分:0)

已经提到@chrisissorry,您应该使用#include <iostream> #include <vector> class Mesh2D { private: size_t rows; size_t columns; std::vector<double> mesh; public: Mesh2D(size_t Nx, size_t Ny) : rows(Nx), columns(Ny), mesh(Nx*Ny) { std::cout << "Mesh created." << std::endl; } double getrows() const {return rows;} double getcolumns() const {return columns;} double& operator()(size_t i, size_t j) { if (i > rows || j > columns){ throw std::out_of_range("Index exceeds array bounds."); } return mesh[j + i*columns]; } const double& operator()(size_t i, size_t j) const { if (i > rows || j > columns) { throw std::out_of_range("Index exceeds array bounds."); } return mesh[j + i*columns]; } }; 而不是Symfony\Component\Security\Core\Exception\AccessDeniedException

就我而言,我遇到了与您相同的问题,但可能出于不同的原因,我有一个返回“ Symfony\Component\Finder\...(例如:500”的“全局执行”捕获程序) 但是,我在api平台上使用的Exception: 500就像防火墙的安全性一样: 更精确的第一和全球之后。 但是现在我不这么认为。

因此,我已经评论了“全局”异常,现在我的accessDenied就像一个吊饰一样工作。

这是我的exception_to_status中的exception_to_status

config\packages\api_platform.yaml

您可以看到我已经评论了# config/packages/api_platform.yaml api_platform: # ... exception_to_status: # The 4 following handlers are registered by default, keep those lines to prevent unexpected side effects Symfony\Component\Serializer\Exception\ExceptionInterface: 400 # Use a raw status code (recommended) ApiPlatform\Core\Exception\InvalidArgumentException: !php/const Symfony\Component\HttpFoundation\Response::HTTP_BAD_REQUEST ApiPlatform\Core\Exception\FilterValidationException: 400 Doctrine\ORM\OptimisticLockException: 409 # 40X Symfony\Component\HttpKernel\Exception\BadRequestHttpException: 400 Symfony\Component\HttpKernel\Exception\NotFoundHttpException: 404 Symfony\Component\Security\Core\Exception\AccessDeniedException: 403 Doctrine\ORM\EntityNotFoundException: 404 Doctrine\ORM\NotFoundException: 404 NotFoundException: 404 # 50X # Exception: 500 处理程序。

答案 1 :(得分:0)

我认为api平台实际上无法在exception_to_status配置中捕获自定义异常代码。

我刚刚找到一种解决方法:

  • 请勿在{{1​​}}中进行任何更改,您不必定义自定义exception_to_status。
  • 默认exception_to_status映射包含config/packages/api_platform.yaml
  • 因此,在您的自定义异常类中实现此接口

然后...就是这样!您将获得一个400状态代码WITH(这是我想要的)您的自定义异常消息! API hydra:description中不再有默认的“内部服务器错误”消息。

因为现在,即使Symfony\Component\Serializer\Exception\ExceptionInterface: 400仍保留自定义消息,api平台的ErrorNormalizerTrait仍能正常工作。