Symfony : comment gérer l’apparition du panneau de connexion dans les zones rafraichies en Ajax
27 mai 2008Symfony permet assez facilement de mettre en œuvre des appels Ajax afin de dynamiser vos écrans. Symfony permet également de facilement sécuriser tout ou partie de vos applications via de simples paramétrages. Si l’utilisateur connecté n’a pas le degré suffisant d’autorisation ou si sa session a expirée, il sera automatiquement dirigé, par le filtre de sécurité de Symfony, vers, par exemple, le panneau de login de votre application.
Un effet de bord de ces techniques est que, si l’utilisateur de votre application laisse sa session expirer, puis lance une action Ajax devant rafraichir une partie de son écran, il verra le panneau de connexion apparaitre dans cette zone : effet peu ergonomique garanti !

Voila la technique que j’utilise pour pallier à ce problème. A vrai dire, je ne sais pas si elle correspond à l’état de l’art, mais elle a l’avantage de bien fonctionner sans nécessiter de multiples interventions dans l’application.
1/ Permettre l’évaluation du Javascript dans les templates affichés via des appels AJax
Cela dépend de la librairie Javascript que vous utilisez. Par exemple, avec JQuery, il faudra préciser que le type de donnée retourné est ‘html’. Si vous utilisez les helpers Symfony, il vous faudra ajouter 'script' => true au tableau d’options passé au helper.
Cette étape n’est pas obligatoire. Elle permet toutefois de rediriger les utilisateurs en Javascript vers le panneau de connexion.
2/ Modifier le code du contrôleur gérant votre panneau de connexion
On va simplement lui dire que, si il est appelé via une requête Ajax, il n’utilise pas la vue habituelle.
Par exemple :
/** * Executes login action * */ public function executeLogin() { if($this->getRequest()->isXmlHttpRequest()) { $this->getResponse()->setStatusCode(401); return 'redirect'; } /* end of the login action code */ }
3/ Créer la vue appelée précédemment
Ici le fichier loginRedirect.php
<?php use_helper('Url'); echo javascript_tag (' location.href=\'.url_for('@user_logout').'\'; '); ?>
La route correspondant à l’action de déconnexion @user_logout doit bien sur exister.
Voilà !
Et vous, que pensez vous de cette méthode ?


