Conflit d'annotations dans les contrôleurs
Bonjour,
J'ai ecrit une annotation qui pour sur les actions d'un controleur qui permet de lancer une exception si l'appel à cette action ne se fait pas à travers une requête XMLHttpRequest (appel AJAX).
Celle-ci s'utilise comme ceci:
Code:
1 2 3 4 5 6 7 8 9
|
/**
* @Route("/saisonAdd", options={"expose"=true})
* @Template()
* @XmlHttpRequest()
*/
public function saisonAddAction() {
return array( );
} |
Mon annotation fonctionne très bien excepté que lorsque j'utilise cette annotation avec l'annotation @Secure(roles="A")
Exemple :
Code:
1 2 3 4 5 6 7 8 9 10
|
/**
* @Route("/saisonAdd", options={"expose"=true})
* @Template()
* @XmlHttpRequest()
* @Secure(roles="A")
*/
public function saisonAddAction() {
return array( );
} |
Dans ce deuxième cas, si l'utilisateur n'a pas le role A, Secure fais sont travaille.
Si l'utilisateur possède le role A, XMLHttpRequest devrait être utilisé mais ce n'est pas le cas comme si l'annotation n'existait pas.Bref, il est bypassé.
Une idée du pourquoi/Comment ?
L'annotation @Secure vient du bundle JMS/SecurityBundle fournit par défaut avec symfony.
Pour la mienne, voici comment je l'ai fait:
Annotation:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <?php
namespace Mendrock\Bundle\ExtraBundle\Annotation;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
/**
* @Annotation
*/
class XmlHttpRequest
{
public $message = 'The action could be an XMLHttpRequest call.';
public function checkRequest($event){
if (!$event->getRequest()->isXmlHttpRequest()) {
throw new AccessDeniedHttpException($this->message);
}
}
public function execute($event){
$this->checkRequest($event);
}
} |
EventListener
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
<?php
namespace Mendrock\Bundle\ExtraBundle\Listener;
use Doctrine\Common\Annotations\Reader;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Mendrock\Bundle\ExtraBundle\Annotation\XmlHttpRequest;
class EventListener {
private $reader;
public function __construct(Reader $reader) {
$this->reader = $reader;
}
/**
* This event will fire during any controller call
*/
public function onKernelController(FilterControllerEvent $event) {
if (!is_array($controller = $event->getController())) {
return;
}
$method = new \ReflectionMethod($controller[0], $controller[1]);
foreach ($this->reader->getMethodAnnotations($method) as $annotation) {
if ($annotation instanceof XmlHttpRequest) {
$annotation->execute($event);
}
}
}
} |
Service:
Code:
1 2 3 4 5 6
|
services:
annotations.xmlhttprequest:
class: Mendrock\Bundle\ExtraBundle\Listener\EventListener
tags: [{name: kernel.event_listener, event: kernel.controller, method: onKernelController}]
arguments: [@annotation_reader] |
Merci d'avance.