Rediriger si l'utilisateur est connecté
je construis une application web avec Symfony 2, en utilisant le paquet FOSUserBundle.
Les utilisateurs créent un compte, se connectent et commencent à utiliser l'application.
ce que je veux réaliser maintenant, c'est que l'utilisateur soit redirigé vers son compte à partir de n'importe quelle page où il peut être s'il est connecté.
Cela comprend:
- s'ils reviennent à la page de connexion
- s'ils obtiennent retour à la page d'enregistrement
- si ils vont à la page d'accueil du site
- une fois qu'ils auront confirmé leur courriel
- une fois qu'ils ont réinitialisé leur mot de passe
fondamentalement, le code serait quelque chose comme ceci:
$container = $this->container;
$accountRouteName = "DanyukiWebappBundle_account";
if( $container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY') ){
// authenticated (NON anonymous)
$routeName = $container->get('request')->get('_route');
if ($routeName != $accountRouteName) {
return $this->redirect($this->generateUrl($accountRouteName));
}
}
le problème est que je ne sais pas où ce code devrait aller.
Il doit être exécuté pour toute requête. En Symfony 1 j'aurais utilisé un filtre.
2 réponses
j'ai trouvé la solution moi-même:
<?php
namespace Danyuki\UserBundle\Listener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;
class LoggedInUserListener
{
private $router;
private $container;
public function __construct($router, $container)
{
$this->router = $router;
$this->container = $container;
}
public function onKernelRequest(GetResponseEvent $event)
{
$container = $this->container;
$accountRouteName = "DanyukiWebappBundle_account";
if( $container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY') ){
// authenticated (NON anonymous)
$routeName = $container->get('request')->get('_route');
if ($routeName != $accountRouteName) {
$url = $this->router->generate($accountRouteName);
$event->setResponse(new RedirectResponse($url));
}
}
}
}
et puis, dans les services.fichier yml de mon paquet:
services:
kernel.listener.logged_in_user_listener:
class: Danyuki\UserBundle\Listener\LoggedInUserListener
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
arguments: [ @router, @service_container ]
vous pouvez également faire cette solution si vous voulez juste vérifier une fois:
il y a un événement déclenché chaque fois qu'il y a une connexion réussie. l'événement est nommé:
de sécurité.interactive_login
pour vous abonner à cet événement, vous devez créer un conteneur de service avec votre classe créée disons" LoginListener.php " et injecter la balise "noyau.even_listener "avec l'événement" sécurité.interactive_login":
<service id="mylogin.success.listener" class="path\to\class\LoginListener">
<tag name="kernel.event_listener" event="security.interactive_login" method="onLoginSuccess" />
</service>
dans LoginListener:
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
public function onLoginSuccess(InteractiveLoginEvent $event) {
if ($this->_security->isGranted('IS_AUTHENTICATED_FULLY')) {
//your code here...
}
}
vous pouvez également ajouter d'autres dépendances et l'injecter au constructeur, dans mon cas j'ai dû injecter la sécurité, la session et le conteneur:
public function __construct(SecurityContext $security, Session $session, ContainerInterface $container) {
}