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:
Mon annotation fonctionne très bien excepté que lorsque j'utilise cette annotation avec l'annotation @Secure(roles="A")
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( ); }
Exemple :
Dans ce deuxième cas, si l'utilisateur n'a pas le role A, Secure fais sont travaille.
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( ); }
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
Service:
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); } } } }
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.
Partager