Symfony在安全解决后运行参数值解决程序

gajydyqb  于 2023-01-02  发布在  其他
关注(0)|答案(1)|浏览(103)

我有一个创建和验证DTO的ArgumentValueResolverInterface
我还设置了一个防火墙来保护路由,另外还使用IsGranted属性进行细粒度访问控制。
问题是值解析器和验证在安全防火墙之前运行,即使请求未经身份验证也会显示验证错误。
我怎样才能改变值解析器在安全性被解析后运行?这可能吗?

class RequestDTOValueResolver implements ArgumentValueResolverInterface
{

    /**
     * RequestDTOValueResolver constructor.
     * @param ValidatorInterface $validator
     */
    public function __construct(protected ValidatorInterface $validator)
    {}

    /**
     * @inheritDoc
     */
    public function supports(Request $request, ArgumentMetadata $argument): bool
    {
        return is_subclass_of($argument->getType(), RequestDTOInterface::class);
    }

    /**
     * @inheritDoc
     * @throws ValidationException
     * @throws Exception
     */
    public function resolve(Request $request, ArgumentMetadata $argument): iterable
    {

        $className = $argument->getType();

        /** @var AbstractRequestDTO $dto */
        $dto = new $className($request); //$this->parseRequest($request, $argument);
        $groups = $dto->getGroups();

        $errors = $this->validator->validate($dto, null, !empty($groups) ? $groups : null);

        if ($errors->count()) {
            throw ValidationException::create($errors, "One or more fields are invalid.");
        }

        yield $dto;
    }

}
flvlnr44

flvlnr441#

根据这里提供的官方文档(不同的SF版本之间没有太大区别):https://symfony.com/doc/5.2/controller/argument_value_resolver.html
通过设置适当的优先级,您可能会实现您的目标

App\ArgumentResolver\UserValueResolver:
    tags:
        - { name: controller.argument_value_resolver, priority: 50 }

我还建议检查每个服务的运行顺序。在这里你可以看到SF是如何做的:
https://symfony.com/doc/current/introduction/http_fundamentals.html

相关问题