Umleiten, wenn der Benutzer angemeldet ist

Ich erstelle mit Symfony 2 eine Webanwendung mit dem FOSUserBundle-Bundle.
Benutzer erstellen ein Konto, melden sich an und starten die Anwendung.

Was ich jetzt erreichen möchte, ist, dass der Benutzer von jeder Seite, auf der er sich befindet, wenn er angemeldet ist, zu seinem Konto umgeleitet wird.
Das beinhaltet:

wenn sie zur Anmeldeseite zurückkehrenwenn sie zur Registrierungsseite zurückkehrenwenn sie auf die Homepage der Website gehensobald sie ihre E-Mail bestätigensobald sie ihr Passwort zurückgesetzt haben

Grundsätzlich würde der Code ungefähr so ​​lauten:

<code>$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));
    }
}
</code>

Das Problem ist, dass ich nicht weiß, wohin der Code gehen soll.
Es sollte für jede Anfrage ausgeführt werden. In Symfony 1 hätte ich einen Filter verwendet.

questionAnswers(2)

Ich habe die Lösung selbst gefunden:

<code><?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));
            }
        }
    }
}
</code>

Und dann in der services.yml-Datei meines Bundles:

<code>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 ]  
</code>

Sie können diese Lösung auch ausführen, wenn Sie nur einmal prüfen möchten:

Bei jeder erfolgreichen Anmeldung wird ein Ereignis ausgelöst.Die Veranstaltung heißt:

security.interactive_login

Um dieses Ereignis zu abonnieren, müssen Sie einen Service-Container mit Ihrer erstellten Klasse erstellen. Sagen wir "LoginListener.php" und fügen Sie dem Tag "kernel.even_listener" das Ereignis "security.interactive_login" hinzu:

<code><service id="mylogin.success.listener" class="path\to\class\LoginListener">
   <tag name="kernel.event_listener" event="security.interactive_login" method="onLoginSuccess" />
</service>
</code>

im LoginListener:

<code>use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;

public function onLoginSuccess(InteractiveLoginEvent $event) {
   if ($this->_security->isGranted('IS_AUTHENTICATED_FULLY')) {
      //your code here...
   }
}
</code>

Sie können auch andere Abhängigkeiten hinzufügen und sie in den Konstruktor einfügen. In meinem Fall musste ich Sicherheit, Sitzung und Container einfügen:

<code>public function __construct(SecurityContext $security, Session $session,            ContainerInterface $container) {

}
</code>

yourAnswerToTheQuestion