Christophe Meneses - Développeur
  • Liste des articles
  • Contact
  • Linkedin
  • Viadeo
  • Github
Tous les articles PHP / Symfony Redirection dynamique avec un formulaire de connexion traditionnel Symfony
PHP Symfony

Redirection dynamique avec un formulaire de connexion traditionnel Symfony

Publié le 29/01/2018.

Si vous utilisez un formulaire de connexion traditionnel et que vous voulez rediriger de manière dynamique l'utilisateur vers une page précise, il existe le paramètre de configuration success_handler du composant de sécurité. Ce paramètre de configuration est très peu documenté. Je vais donner ici un exemple d'utilisation.

Contexte

Il existe différentes méthodes pour rediriger vers une page après une connexion réussie. Cependant, il est nécessaire de connaitre à l'avance la page cible. Si vous avez des règles métiers complexes, par exemple vous devez rediriger vers différents endroits en fonction de l'utilisateur qui s'est connecté, le paramétre de configuration success_handler peut répondre à votre besoin.

Pour illustrer le propos, je vais prendre un exemple simple. En fonction des préférences de l'utilisateur, on doit rediriger cet utilisateur vers la bonne page d'accueil et la bonne locale après une connexion réussie.

Solution

Il va être nécessaire de créer un service qui implémente Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface. On va nommer ce service AuthentificationSuccessHandler. Avant de le créer, on va configurer le composant sécurité (fichier security.yml) pour lui demander d'appeler ce service, en cas de connexion réussie. Comme vu en introduction, c'est grâce au paramètre success_handler :

security:
    firewalls:
        main:
            form_login:
                success_handler: App\Security\Handler\AuthentificationSuccessHandler

Ensuite, on crée notre service AuthentificationSuccessHandler :

<?php

namespace App\Security\Handler;

use App\Entity\Collaborator;
use App\Cms\HomepageFinder;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;

class AuthentificationSuccessHandler implements AuthenticationSuccessHandlerInterface
{
    /** @var RouterInterface */
    private $router;

    /** @var HomepageFinder */
    private $homepageFinder;

    /**
     * LogoutSuccessHandler constructor.
     *
     * @param HomepageFinder      $homepageFinder
     * @param RouterInterface     $router
     */
    public function __construct(HomepageFinder $homepageFinder, RouterInterface $router)
    {
        $this->router = $router;
        $this->homepageFinder = $homepageFinder;
    }

   /**
    * {@inheritdoc}
    */
    public function onAuthenticationSuccess(Request $request, TokenInterface $token)
    {
        /** @var Collaborator $collaborator */
        $collaborator = $token->getUser();

        $targetRouteName = $this->homepageFinder->getHomepageRoute($collaborator->getEmployer());

        return new RedirectResponse($this->router->generate($targetRouteName, [
            '_locale' => $collaborator->getLocale(),
        ]));
    }
}

L'interface AuthenticationSuccessHandlerInterface nécessite d'implémenter la méthode onAuthenticationSuccess. Elle donne accès à la requête en cours et au token de l'utilisateur qui vient de se connecter.

Si vous avez besoin d'autres services, il suffit de les injecter dans le constructeur. Par exemple, ici on a service qui retourne le nom de la route cible en fonction de l'utilisateur connecté.

La méthode onAuthenticationSuccess doit retourner une réponse. Ici on redirige vers la page d'accueil destinée à cet utilisateur, grâce au service HomepageFinder.

Version

Cet article a été testé avec :

Symfony : >= 3.4
PHP : >= 7.1
Début de l'article

Tous les articles PHP / Symfony Redirection dynamique avec un formulaire de connexion traditionnel Symfony

Liste des articles par catégorie

  1. Tous 100
  2. Apache2
  3. APC1
  4. Assetic2
  5. Bash2
  6. CentOS9
  7. Composer3
  8. CSS1
  9. Deployer1
  10. Design Pattern10
  11. Docker4
  12. Doctrine11
  13. Elasticsearch2
  14. Git4
  15. Google Charts1
  16. Hardware1
  17. Hébergement1
  18. JavaScript1
  19. jQuery4
  20. Kibana1
  21. Logstash1
  22. Machine Learning1
  23. MariaDB1
  24. Memcached2
  25. MySQL3
  26. Nginx1
  27. PHP54
  28. PHP_CodeSniffer1
  29. PHP-FPM2
  30. PhpMyAdmin1
  31. PhpStorm3
  32. PHPUnit2
  33. PostgreSQL2
  34. RabbitMQ1
  35. SQL1
  36. SVN4
  37. Sybase ASE1
  38. Symfony49
  39. Twig3
  40. Ubuntu12
  41. Xdebug4

Derniers articles publiés

MariaDB
Chiffrer une base de données MariaDB

Doctrine
Doctrine ne met pas à jour un attribut de type "array"

PHP / Symfony
Redirection dynamique avec un formulaire de connexion traditionnel Symfony

Xdebug / Nginx
Éviter l'erreur 504 Gateway Timeout lors d'une session de débogage avec Xdebug

PHPUnit
Mock PHPUnit : méthode qui retourne différentes valeurs en fonction de la valeur passée en argument

PHP Symfony HTML5 CSS3 JavaScript Bootstrap MySQL

© 2014 - 2018 réalisé par Christophe MENESES