Comment rediriger dans onSecurityInteractiveLogin méthode dans LoginListener - Symfony2
Nous voulons rediriger vers un chemin ou un autre après la connexion. Aussi, nous devons passer de la langue dans cette voie.
Nous avons une Connexion écoute comme un service pour vérifier cela. Notre problème est de faire la redirection accion.
Code:
<service id="acme.login_listener" class="acme\DemoBundle\Listener\LoginListener">
<tag name="kernel.event_listener" event="security.interactive_login" method="onSecurityInteractiveLogin" priority="-1" />
<tag name="kernel.event_listener" event="filter.response" method="onKernelResponse" />
<argument type="service" id="service_container" />
<argument type="service" id="router" />
</service>
L'auditeur code:
namespace Acme\DemoBundle\Listener;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Router;
class LoginListener
{
protected $container;
protected $router;
public function __construct(ContainerInterface $container, Router $router)
{
$this->container = $container;
$this->router = $router;
}
public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
{
$token = $event->getAuthenticationToken();
$request = $event->getRequest();
$username = $token->getUsername();
$em = $this->container->get('doctrine')->getEntityManager();
$user = $em->getRepository('acmeDemoBundle:User')->findOneByUsername($username);
$locale = strtolower($user->getUsuari()->getIdioma()->getCodi6391());
$locale = 'ca'; //force locale test
$session = $request->getSession();
$session->setLocale($locale);
$session->set('idioma', $locale);
$session->set('_locale', $locale);
$session->set('locale', $locale);
$url = $this->router->generate('onePath', array('_locale' => $locale));
//$event->setResponse(new RedirectResponse($url));
//$event->stopPropagation();
//echo $url;exit;
$response = new RedirectResponse($url);
return $response;
...
Notre problème est de faire la redirection vers le souhaite chemin dans onSecurityInteractiveLogin fonction.
Nous avons essayé de faire l' $event->setResponse mais ça ne fonctionne pas. Ce $event var n'ont pas cette méthode.
Une idée?
Merci pour votre aide.
Édité: deuxième option (Jan 27, 2012)
Suivantes: http://www.reecefowell.com/2011/10/26/redirecting-on-loginlogout-in-symfony2-using-loginhandlers/
J'ai essayé d'utiliser des Gestionnaires. J'ai configuré l'services.xml:
<service id="company.login_success_handler" class="project\demoBundle\Handler\LoginSucessHandler">
<tag name="monolog.logger" channel="project" />
<argument type="service" id="logger" />
<argument type="service" id="router" />
</service>
SUR la sécurité.yml:
firewalls:
main:
pattern: /.*
form_login:
check_path: /login_check
login_path: /login
success_handler: company.login_success_handler
use_forward: false
Et dans Symfony/src/project/demoBundle/Handler/loginSuccessHandler.php
<?php
namespace project\demoBundle\Handler;
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Router;
class LoginSuccessHandler implements AuthenticationSuccessHandlerInterface
{
protected $router;
protected $security;
public function __construct(Router $router, SecurityContext $security)
{
$this->router = $router;
$this->security = $security;
echo "hello world";exit;
}
public function onAuthenticationSuccess(Request $request, TokenInterface $token)
{
echo "hello world 2";exit;
if ($this->security->isGranted('ROLE_SUPER_ADMIN'))
{
$response = new RedirectResponse($this->router->generate('category_index'));
}
elseif ($this->security->isGranted('ROLE_ADMIN'))
{
$response = new RedirectResponse($this->router->generate('category_index'));
}
elseif ($this->security->isGranted('ROLE_USER'))
{
//redirect the user to where they were before the login process begun.
$referer_url = $request->headers->get('referer');
$response = new RedirectResponse($referer_url);
}
return $response;
}
}
Mais si je exécuter l'application web, il n'est pas dans cette fonction et ne pas afficher "Hello world".
Savez-vous ce que je fais mal?
Merci!!!!
OriginalL'auteur Santi | 2012-01-23
Vous devez vous connecter pour publier un commentaire.
Utiliser un gestionnaire au lieu d'un écouteur d'événement si vous avez besoin de changer la réponse. Plus d'informations ici: http://www.reecefowell.com/2011/10/26/redirecting-on-loginlogout-in-symfony2-using-loginhandlers/
J'ai essayé de nouveau et il fonctionne très bien. Le lien envoyé par @theonly92 est la réponse à nos fins. Merci!
OriginalL'auteur TheOnly92
Cela peut être une autre solution:
https://gist.github.com/snc/1312769
_target_path
ne fonctionne pas pour moi. Symfony 3.4.18OriginalL'auteur Sfblaauw
J'ai trouvé le UrlGeneratorInterface utilisé dans FOSUserBundle
FosUserBundle d'Accrochage dans les contrôleurs de
OriginalL'auteur Santi