2012-01-29 20 views
21

Dla powodzenia logowania jest parametr use_referer: true. W przypadku błędu logowania jest tylko failure_path, co nie jest tym, czego szukam.Jak powrócić do strony odsyłającej po niepowodzeniu logowania?

Druga sprawa: jak to zrobić i przekazać komunikat o błędzie?

Po trzecie: jak wrócić do strony odsyłającej po wylogowaniu?

+0

dlaczego ścieżka awarii nie byłaby po prostu znakiem zachęty logowania? – JamesHalsall

+1

ponieważ mogę się zalogować z każdej podstrony. Nie mam jednego formularza logowania pod określonym adresem URL, więc nie chcę przekierowywać użytkownika na stronę główną, gdy jest on zalogowany, na przykład na innej stronie profilu użytkownika. –

Odpowiedz

49

Rozwiązałem go.

Jest rozwiązanie: How to disable redirection after login_check in Symfony 2

i tutaj jest kod, który rozwiązuje mój problem:

<?php 

namespace Acme\MainBundle\Handler; 

use Symfony\Component\Security\Http\Logout\LogoutSuccessHandlerInterface; 
use Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface; 
use Symfony\Component\Security\Core\Exception\AuthenticationException; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\RedirectResponse; 

class AuthenticationHandler implements AuthenticationFailureHandlerInterface, LogoutSuccessHandlerInterface 
{ 
    public function onAuthenticationFailure(Request $request, AuthenticationException $exception) 
    {  
     $referer = $request->headers->get('referer');  
     $request->getSession()->setFlash('error', $exception->getMessage()); 

     return new RedirectResponse($referer); 
    } 

    public function onLogoutSuccess(Request $request) 
    { 
     $referer = $request->headers->get('referer'); 
     return new RedirectResponse($referer); 
    } 
} 

do obsługi zdarzeń dodać do security.yml na przykład:

form_login: 
    check_path: /access/login_check 
    login_path:/
    use_referer: true 
    failure_handler: authentication_handler 
logout: 
    path: /access/logout 
    target:/
    success_handler: authentication_handler 

i config .yml:

services: 
    authentication_handler: 
     class: Acme\MainBundle\Handler\AuthenticationHandler 
+4

$ request-> headers-> get ('referer'); czasem zwraca wartość null (zostało odtworzone w Firefoksie). To rozwiązanie nie jest niezawodne, konieczne jest rozwiązanie awaryjne lub inne rozwiązanie. – Julien

+0

@ wojciech-kulik Mam następujący błąd: '' '$ request-> getSession() -> setFlash ('error', $ exception-> getMessage());' '' '' 'FatalErrorException: Błąd: Wywołanie niezdefiniowanej metody Symfony \ Component \ HttpFoundation \ Session \ Session :: setFlash() in /var/www/symfony/src/Application/Sonata/UserBundle/Form/Handler/AuthenticationHandler.php line 16''' – jcarlosweb

+0

@webyseo Prawdopodobnie masz inną wersję Symfonii, a wiadomości flash ustawiane są w inny sposób. Może to pomoże: http://stackoverflow.com/questions/13348534/symfony-2-setting-a-flash-message-outside-of-controller –