我使用APIPlatform 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>
有人有类似的问题吗?
感谢您的阅读,
答案 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配置中捕获自定义异常代码。
我刚刚找到一种解决方法:
config/packages/api_platform.yaml
然后...就是这样!您将获得一个400状态代码WITH(这是我想要的)您的自定义异常消息! API hydra:description中不再有默认的“内部服务器错误”消息。
因为现在,即使Symfony\Component\Serializer\Exception\ExceptionInterface: 400
仍保留自定义消息,api平台的ErrorNormalizerTrait
仍能正常工作。