2012-03-22 16 views
5

Używam FOSUserBundle i wymagam możliwości logowania z 2 różnych tras (lub więcej). Te trasy będą miały różne szablony, a także logowanie do różnych obszarów. Jedyną różnicą między loginami jest wymagane zezwolenie. Trasy będzie coś wzdłuż liniiSymfony2 - FOSUserBundle - Wiele lokalizacji logowania

site.com/login

site.com/admin/login

a także możliwe site.com/ajax_login

byłem w stanie opracować, jak uzyskać różne szablony do renderowania poprzez zgrywanie wszystkiego poza tokenem CSRF z FOSUserBundle login.html.twig (to jest przesłonięte), a następnie tworzenie tras, które renderują własne pola logowania, a także trasę logowania (tak, aby po prostu token CSRF zostanie wyrenderowany). To nie działa dla administratora/logowania, ponieważ formularz jest wysyłany do logowania, a jeśli się nie powiedzie, wyświetla tę stronę.

Czy istnieje łatwy sposób osiągnięcia tego?

+0

Czy mówisz o różnych zaporach? – tamir

+0

W jaki sposób wykorzystałeś formularz logowania w wielu szablonach? – httpete

Odpowiedz

0

Czy możesz opublikować swój szablon?

Czy poprawnie edytowałeś ścieżkę w szablonie?

<form action="{{ path('form_submit') }}" method="post" {{ form_enctype(form) }}> 

Chcesz wysłać formularz do właściwego kontrolera.

1

Oto co w końcu wymyślił, w zasadzie korzystać z tego samego firewalla i dzielić ten sam kontekst, więc kiedy się zalogować za pośrednictwem normalnego logowania oni również uzyskać dostęp do administratora (zakładając, że są admin)

firewalls: 
    admin: 
     context:   site 
     switch_user:  true 
     pattern:   /admin(.*) 
     form_login: 
      provider:  fos_userbundle 
      login_path:  /admin/login 
      success_handler: admin_authentication_handler 
      use_forward: false 
      check_path:  /admin/login_check 
      failure_path: null 
      use_referer: true 
      always_use_default_target_path: true 
      default_target_path: /admin/ 
     logout: 
      path:   /admin/logout 
      target:   /admin/login 
     anonymous: true 
    public: 
     pattern: ^/ 
     context:   site 
     form_login: 
      login_path:  /login 
      success_handler: authentication_handler 
      failure_handler: authentication_handler 
      provider: fos_userbundle 
     anonymous: true 
     logout: true 

Oczywiście, jeśli chcesz utworzyć pole logowania AJAX, musisz zastąpić procedury obsługi udanych i niepowodzeń i sprawdzić, czy żądanie jest XmlHttpRequest i zwróć wynik logowania.

2

Przez pewien czas utknąłem w tym samym pytaniu, a potem sam stworzyłem rozwiązanie. Wiedziałem, że musi być łatwe rozwiązanie ...

Przesłałem żądanie pobrania, które umożliwia łatwiejsze tworzenie nowych szablonów logowania. Sprawdź żądanie ściągnięcia tutaj: https://github.com/FriendsOfSymfony/FOSUserBundle/pull/1186.

Istnieje również inny dość łatwy sposób, jak to osiągnąć. Rozszerz SecurityController i zmienić renderLogin metodę z następującą zawartością

protected function renderLogin(array $data, $template) 
{ 
    return $this->container->get('templating')->renderResponse('YourBundle:Security:login.html.twig'); 
} 

Następnie należy utworzyć trasę do nowo utworzonego kontrolera:

admin.login: 
    pattern: /admin/login 
    defaults: { _controller: YourBundle:Security:login } 

po tym tylko trzeba zrobić, to zmienić swój config zabezpieczeń odpowiednio. Zmień login_login_formalisty na/admin/login i jesteś gotowy do pracy.

+0

Twoje żądanie ściągnięcia zawiera błędy, a zatem nie jest jeszcze scalone z FOSUserBundle. Czy masz aktualizację? – Mondane

Powiązane problemy