2013-07-09 10 views
6

Rozszerzam procedurę obsługi błędu uwierzytelniania i wszystko działa w zasadzie poprawnie, ale w przypadku jednego małego problemu.Przesłanianie procedury obsługi niepowodzeń uwierzytelniania - Symfony2

To mój services.yml:

http.utils.class: 
    class: Symfony\Component\Security\Http\HttpUtils 
    auth.fail: 
    class: Acme\MyBundle\AuthenticationFailure 
    arguments: 
     - @http_kernel 
     - @http.utils.class 
     - [] 

Mam ustawiony ten należy stosować w security.yml:

failure_handler: auth.fail 

To mój Acme \ MyBundle \ AuthenticationFailure.php:

namespace Acme\MyBundle; 

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\Security\Core\Exception\AuthenticationException; 
use Symfony\Component\Security\Http\Authentication\DefaultAuthenticationFailureHandler; 
use Symfony\Component\HttpFoundation\Response; 

class AuthenticationFailure extends DefaultAuthenticationFailureHandler 
{ 

    public function onAuthenticationFailure(Request $request, AuthenticationException $exception) 
    { 

     //do something 

    } 

} 

Problem polega na tym, że opcje ustawione w pliku security.yml są ignorowane. Wiem, że trzecim parametrem metody _construct klasy jest tablica opcji $ i nie przekazałem niczego jako trzeciego parametru (w services.yml), więc zgaduję, że to jest problem i rozwiązanie może być po prostu przekazać wartości w Zgaduję mogę też zrobić coś takiego:.

arguments: 
    - @http_kernel 
    - @http.utils.class 
    - %security.firewalls.secure_area.form_login% 

.... I nie zostały przetestowane jako problem jest to trudne kodowania, które w services.yml i nie jest to idealne, jak gdybym zmienił nazwę secure_area, która by się zepsuła. Z pewnością te wartości są dostępne w lepszy sposób?

Odpowiedz

8

widzę starasz się przekazać login_path do obsługi błąd uwierzytelnienia ...

... powinien wstrzyknąć @router, dostosowanie metod __construct i wygenerować link z nazwą trasy (nie wzór) używane przez zaporę wewnątrz programu obsługi niepowodzeń. następnie przekieruj użytkownika tam ...

login_path: your_login_route_name # <- not a pattern like /login 

w ten sposób zmiana nazwy firewalla nie złamie aplikacji!


jeśli nawet nie chce przerwać stosowanie w przypadku zmiany nazwy trasy można dokonać tej konfigurowalny aswell:

config.yml

parameters: 
    login.route_name: my_login_route_name 

routing.yml

%login.route_name%: 
    pattern: /login 

security.yml

security: 
    firewalls: 
     your_firewall_name: 
      failure_handler: auth.fail 
      login_path:  %login.route_name% 

usług.yml

auth.fail: 
    arguments: 
     - # ... 
     - @router 
     - %login.route_name% 

Acme \ MyBundle \ AuthenticationFailure

use Symfony\Component\Routing\RouterInterface; 
use Symfony\Component\HttpFoundation\RedirectResponse; 

// ... 

protected $router; 

protected $loginRoute; 

public function __construct( 
    /** ... other arguments **/, 
    RouterInterface $router, 
    $loginRoute 
) 
{ 
    // .. 
    $this->router  = $router; 
    $this->loginRoute = $loginRoute; 
} 

public function onAuthenticationFailure(
    Request $request, 
    AuthenticationException $exception 
) 
{ 

    // ... 

    return new RedirectResponse($this->router->generate($this->loginRoute)); 
} 

Wskazówka odnośnie sugestię

(... używając coś podobnego %security.firewalls.secure_area.form_login%)

nie można uzyskać bezpośredniego dostępu do konfiguracji zabezpieczeń (nie są to parametry - nie można użyć %security.firewall.whatever%!) ...

domyślny $options przekazane __construct musi być tablicą ...

... więc może trzeba otoczyć swoich parametrów przekazanych przez [] jeśli te parametry nie są tablicą.

arguments: 
    - [ %parameter1% , %parameter2% ] 
Powiązane problemy