Wie die Umleitung im onSecurityInteractiveLogin Methode im LoginListener - Symfony2
Wir umleiten wollen, um einen Pfad oder ein anderes nach der Anmeldung. Auch wir müssen zum pass de Sprache in diesem Pfad.
Wir haben ein Login-Listener as a service, dies zu überprüfen. Unser problem ist das umleiten 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>
Den listener 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;
...
Unserem problem zu tun, dass die Umleitung der gewünschte Pfad in onSecurityInteractiveLogin Funktion.
Wir haben versucht zu tun, die $event->setResponse aber es funktioniert nicht. Das $event var nicht über diese Methode.
Irgendeine Idee?
Vielen Dank für Ihre Hilfe.
Bearbeitet: die zweite option (Jan 27, 2012)
Folgenden: http://www.reecefowell.com/2011/10/26/redirecting-on-loginlogout-in-symfony2-using-loginhandlers/
Habe ich versucht zu verwenden-Handler. Ich konfigurierte die 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>
Sicherheit.yml:
firewalls:
main:
pattern: /.*
form_login:
check_path: /login_check
login_path: /login
success_handler: company.login_success_handler
use_forward: false
Und in 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;
}
}
Aber wenn ich das ausführen der web-app, ist es nicht in dieser Funktion und nicht "Hallo Welt".
Weißt du, was ich mache, schlecht?
Danke!
InformationsquelleAutor Santi | 2012-01-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie eine Prozedur anstelle eines Ereignis-listener wenn Sie brauchen, um die Antwort zu ändern. Mehr Informationen hier: http://www.reecefowell.com/2011/10/26/redirecting-on-loginlogout-in-symfony2-using-loginhandlers/
Ich hab nochmal ausprobiert und es funktioniert sehr gut. Die versendeten link @theonly92 ist die Antwort für unsere Zwecke. Danke!
InformationsquelleAutor TheOnly92
Diese können eine andere Lösung:
https://gist.github.com/snc/1312769
InformationsquelleAutor Sfblaauw
Fand ich die UrlGeneratorInterface verwendet in FOSUserBundle
FosUserBundle Einhängen in Controller
InformationsquelleAutor Santi