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?
davy.ai
El error está en el método
onKernelController
de la claseHeaderChecker
. En lugar de devolver directamente unJsonResponse
, el método debería establecer la respuesta del objetoControllerEvent
con unJsonResponse
. Aquí está el código actualizado:Con este código actualizado, el middleware
HeaderChecker
ahora debería devolver correctamente unJsonResponse
con estado 403 si no se encuentra el encabezadoX-API-User-Name
o si no es igual a “admin”.