2013-03-07 23 views
14

Symfony2.0 ve FOSUserBundle kullanıyorum ve giriş formumdaki csrf belirtecini devre dışı bırakmak istiyorum.Oturum açma formunda CSRF belirtecini devre dışı bırak

benim config.yml içinde web sitemde küresel csrf korumasını devre dışı bırakılmıştır: Bu iyi çalışıyor

framework: 
    csrf_protection: 
     enabled:  false 

, hiçbir csrf alan Formlarımla eklenen yoktur. Ancak, bu giriş formu için geçerli değildir.

<input type="hidden" name="_csrf_token" value="{{ csrf_token }}" /> 

nasıl giriş formunda CSRF belirteci devre dışı bırakabilirsiniz: Birlikte şeklinde belirteci dahil etmezseniz sadece bu form, ben "Geçersiz CSRF Token" hatası alıyorum?

+1

Bunu neden yapmak istiyorsunuz? – j0k

+0

İstemcim, kullanıcı giriş sayfasında ne kadar süre oturuyor olursa olsun giriş formunun doğrulanmasını istiyor. Ayrıca, kişisel olarak bu web sitesi için bir CSRF korumasının gerekli olduğunu düşünmüyorum. –

cevap

15

sadece eylem güncellemek gerekmez, sizin security.yml dosyaya gidin ve form_login direktifi gelen csrf_provider kaldırırsanız sınıf ya da herhangi bir şey.

+0

Tamam, bu kabul edilen cevap olmalı .. –

27

Bunu seçenekleri dizisinde 'csrf_protection' => false ayarlayarak formu sınıfında CSRF korumasını devre dışı bırakabilirsiniz: durumunda

class LoginType extends AbstractType 
{ 
    // ... 

    public function getDefaultOptions(array $options) 
    { 
     return array(
      'data_class'  => 'Acme\UserBundle\Entity\User', 
      'csrf_protection' => false 
     ); 
    } 

    // ... 

} 

bunun yerine bir AbstractType sınıfının formunuzu oluşturmak için FormBuilder kullanırken, seçenekler dizisi iletebilir böyle createFormBuilder() için ikinci parametre olarak:

$form = $this->createFormBuilder($users, array('csrf_protection' => false)) 
     ->add(...) 
     ->getForm(); 
+0

Sorun Böyle bir LoginType sınıfım yok. Symfony2 LoginType sınıfını sadece csrf_protection özelliğini false olarak ayarlamak için uzatmalı mıyım? Daha basit bir yolu yok mu? –

+0

Cevabımı güncelledim. Umarım yardımcı olur. –

+0

Evet, csrf'yi false olarak ayarlamak için FOSUserBundle'ın SecurityController'ına bakmam gerektiğini fark ettim. Nasıl devam edeceğime dair daha fazla ayrıntı ile kendi cevabımı yayınladım. +1 –

0

Ben giriş formu instanciated edilir override FOSUserBundle's SecurityController LoginAction gerekiyordu.

yerime başkasının:

$csrfToken = $this->container->get('form.csrf_provider')->generateCsrfToken('authenticate'); 

return $this->container->get('templating')->renderResponse('FOSUserBundle:Security:login.html.'.$this->container->getParameter('fos_user.template.engine'), array(
     'last_username' => $lastUsername, 
     'error'   => $error, 
     'csrf_token' => $csrfToken, 
    )); 

ile:

return $this->container->get('templating')->renderResponse('FOSUserBundle:Security:login.html.'.$this->container->getParameter('fos_user.template.engine'), array(
     'last_username' => $lastUsername, 
     'error'   => $error, 
     'csrf_token' => false, 
    )); 
1

FOSUserBundle kullanıyorsanız ve yalnızca oturum açma formunda CSRF korumasını devre dışı bırakmak istiyorsanız, izlenecek birkaç adım vardır.

Adım 1) öncelikle kendi kullanıcı grubu oluşturabilir gerekir, Güvenlik Kontrolör FOSUserBundle yerleşik SecurityController-binmek üzerinde amacıyla

dosyasını kendi kullanıcı paket & oluşturun.

Yani, orijinal SecurityController sınıfını genişletmesi gerekir app/src/{YourApp} /UserBundle/Controller/SecurityController.php adlı bir dosya oluşturun ve LoginAction içinde LoginAction yöntemiyle

use FOS\UserBundle\Controller\SecurityController as SecurityControllerOrig; 
class SecurityController extends SecurityControllerOrig 
{ 
    public function loginAction(Request $request) 
    { 
    } 
} 

üzerinden kopyalama yöntem, dışarı yorum yapmak ya da bu satırları kaldırın: Sonra

$csrfToken = $this->container->has('form.csrf_provider') 
     ? $this->container->get('form.csrf_provider')->generateCsrfToken('authenticate') 
     : null; 

şey CSRF jetonu görüntülemek geçirilir emin olun:

güvenliğinde hattı:

Adım 2) Symfony'nin firewall kontrol devre dışı bırak CSRF (security.yml)

varolan "csrf_provider" açıklama emin olun.yml:

firewalls: 
     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       #csrf_provider: form.csrf_provider 

Adım 3) FOSUserBundle güvenlik kontrolörü güzergahına geçersiz kılın (routing.yml) routing.yml olarak

, açıklama bu çizgiler:

fos_user_security: 
    resource: "@FOSUserBundle/Resources/config/routing/security.xml" 
    options: 
     expose: true 

altına şu satırları ekleyin yorumlanmış dış hatlar:

#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 

Not 1: Sadece loginAction yöntemini kullanmasını istedim senin özel SecurityController. Diğer iki yöntem, ana sınıfa gider (fark yaratıp yaratmadığından emin değil).

Not 2: "Göster: true" bölümüne ihtiyacınız var! Aksi halde, fos js yönlendirme paketinden bir JavaScript hatası alırsınız.

Bunu yapmalı!

İlgili konular