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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.