es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Verificar encabezado para un controlador específico.

Necesito verificar que al acceder al controlador BooksController, se reciba el encabezado ‘X-API-User-Name = admin’.

Utilizo esta documentación https://symfony.com/doc/current/event-dispatcher/before-after_filters.html

Código

Es mi middleware

namespace App\Event;

use App\Controller\BooksController;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\ResponseEvent;

class HeaderChecker implements EventSubscriberInterface
{
    const HEADER = 'X-API-User-Name';

    public function onKernelController(ControllerEvent $event): void
    {
        $controller = $event->getController();
        if (is_array($controller)) {
            $controller = $controller[0];
        }

        if ($controller instanceof BooksController) {
            $header = $event->getRequest()->headers->has(self::HEADER);
            if (!$header) return new JsonResponse(['message' => 'No se encontró el encabezado X-API-User-Name'], Response::HTTP_FORBIDDEN);

            $admin = $event->getRequest()->headers->get(self::HEADER);
            if ($admin !== 'admin') return new JsonResponse(['message' => 'El encabezado X-API-User-Name no es válido'], Response::HTTP_FORBIDDEN);
        }
    }

    public static function getSubscribedEvents(): array
    {
        return [
            KernelEvents::CONTROLLER => 'onKernelController'
        ];
    }
}

service.yaml code

App\Event\HeaderChecker:
        tags:
            - { name: kernel.event_subscriber, event: kernel.exception, method: 'onKernelController' }

Problema:
A través de var_dump verifiqué que los datos están llegando, pero aquí está el problema. Necesito enviar un JsonResponse con un estado 403 si X-API-User-Name no es admin. Pero mi clase EventSubscriber no devuelve JsonResponse si X-API-User-Name no es admin. ¿Cuál es mi error?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El error está en el método onKernelController de la clase HeaderChecker. En lugar de devolver directamente un JsonResponse, el método debería establecer la respuesta del objeto ControllerEvent con un JsonResponse. Aquí está el código actualizado:

    public function onKernelController(ControllerEvent $event): void
    {
        $controller = $event->getController();
        if (is_array($controller)) {
            $controller = $controller[0];
        }
    
        if ($controller instanceof BooksController) {
            $header = $event->getRequest()->headers->has(self::HEADER);
            if (!$header) {
                $response = new JsonResponse(['message' => 'No se encontró el encabezado X-API-User-Name'], Response::HTTP_FORBIDDEN);
                $event->setResponse($response);
                return;
            }
    
            $admin = $event->getRequest()->headers->get(self::HEADER);
            if ($admin !== 'admin') {
                $response = new JsonResponse(['message' => 'El encabezado X-API-User-Name no es válido'], Response::HTTP_FORBIDDEN);
                $event->setResponse($response);
                return;
            }
        }
    }
    

    Con este código actualizado, el middleware HeaderChecker ahora debería devolver correctamente un JsonResponse con estado 403 si no se encuentra el encabezado X-API-User-Name o si no es igual a “admin”.

Comments are closed.