jeśli używasz FOSUserBundle i chcesz wyłączyć ochronę CSRF tylko w formularzu logowania, musisz wykonać kilka kroków.
Krok 1) Stwórz swój własny pakiet obsługi & Kontroler zabezpieczeń plików
Aby nadmiernie jeździć SecurityController który jest wbudowany w FOSUserBundle, trzeba najpierw stworzyć własny pakiet użytkownika.
Tak, utwórz plik o nazwie app/src/{YourApp} /UserBundle/Controller/SecurityController.php Należy rozszerzyć oryginalnej klasy SecurityController i skopiować metody loginAction
use FOS\UserBundle\Controller\SecurityController as SecurityControllerOrig;
class SecurityController extends SecurityControllerOrig
{
public function loginAction(Request $request)
{
}
}
W loginAction Sposób, skomentuj lub usunąć te linie:
$csrfToken = $this->container->has('form.csrf_provider')
? $this->container->get('form.csrf_provider')->generateCsrfToken('authenticate')
: null;
Następnie upewnij się, że nic nie jest przekazywana do wyświetlenia dla token CSRF:
return $this->renderLogin(array(
'last_username' => $lastUsername,
'error' => $error,
'csrf_token' => false,
));
Krok 2) Wyłącz CSRF sprawdzanie firewall symfony (security.yml)
Upewnij wykomentuj istniejący "csrf_provider:" linię bezpieczeństwa.yml:
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
#csrf_provider: form.csrf_provider
Krok 3) Przestawianie routing dla kontrolera bezpieczeństwa FOSUserBundle za (routing.yml)
W routing.yml, skomentuj te linie:
fos_user_security:
resource: "@FOSUserBundle/Resources/config/routing/security.xml"
options:
expose: true
Dodaj te wiersze poniżej Skomentowane linie:
#Over-ride the SecurityController of the FOSUserBundle:
fos_user_security_login:
path: /login
defaults: { _controller: YourAppUserBundle:Security:login }
methods: [GET]
options:
expose: true
fos_user_security_check:
path: /login_check
defaults: { _controller: FOSUserBundle:Security:check }
methods: [POST]
options:
expose: true
fos_user_security_logout:
path: /logout
defaults: { _controller: FOSUserBundle:Security:logout }
methods: [GET]
options:
expose: true
Uwaga 1: Poprosiłem tylko o użycie metody loginAction z Twój niestandardowy SecurityController. Pozostałe dwie metody przechodzą do klasy nadrzędnej (nie wiem, czy to robi różnicę).
Uwaga 2: Potrzebujesz części "expose: true"! W przeciwnym razie dostaniesz błąd JavaScript z pakietu routingu fos js.
To powinno wystarczyć!
Dlaczego chcesz to zrobić? – j0k
Ponieważ mój klient chce, aby formularz logowania był sprawdzany bez względu na to, jak długo użytkownik siedział na stronie logowania. Poza tym osobiście nie uważam, że ochrona CSRF jest konieczna dla tej konkretnej witryny. –