2012-03-27 101 views
43

我建立一個移動應用程序通過Web服務 說我的Symfony2的程序,我無法找到一個方法來禁用特定的控制器上CSRF保護/行動禁用symfony的CSRF 2 Ajax的令牌保護提交

我想將註冊數據發佈到此操作並使用sf2表單驗證。我不叫的形式在我的手機應用程序

無法更改容器參數在行動上,拋出一個異常,因爲它是一個冰凍的參數...

我不想禁用整個表單保護我應用程序

任何線索?

謝謝!

更新:用symfony的2.1.x

/** 
* {@inheritdoc} 
*/ 
public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'csrf_protection' => false, 
    )); 
} 
+23

'$形式= $這 - >的CreateForm($ formType,$實體,陣列( 'csrf_protection'=>假))方便;' – 2012-09-03 00:39:06

+0

沒沒有多調查,但使用表單類型作爲服務,我不得不使用SalmanPK的解決方案,因爲默認的csrf_protection選項未被識別。 – tuxone 2015-11-07 17:32:22

回答

78

如果你正在尋找一個更容易和更快的解決方案比上面的答案建議,這裏是如何:

<?php 

// ... 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 
use Symfony\Component\OptionsResolver\OptionsResolver; 

class MyType extends AbstractType 
{ 
    // ... 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'csrf_protection' => false, 
     )); 
    } 
} 

..或者,如果您使用的Symfony 2.0 *:

<?php 

// ... 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 

class MyType extends AbstractType 
{ 
    // .... 

    public function getDefaultOptions(array $options) 
    { 
     $options = parent::getDefaultOptions($options); 
     $options['csrf_protection'] = false; 

     return $options; 
    } 
} 

更多的信息,請參考Symfony documentation


編輯:更新答案最新Symfony的版本,感謝 naitsirch

+0

謝謝! 我正在尋找像@ jperovic一樣的自定義csrf提供程序,但是您的解決方案能夠工作並且乾淨:) – 2012-03-27 12:07:30

+0

絕對簡單的解決方案! :) – 2012-03-27 12:13:49

+0

缺少像symfony 1一樣的disableCSRFProtection()方法。 在ajax環境中真的很方便 – 2012-03-27 12:22:48

1

我不能100%肯定,但我覺得我讀的地方,你可以通過csrf_provider選項,同時創造形式。

所有提供商接口Symfony\Component\Form\Extension\Csrf\CsrfProvider的亞型,你應該能夠創建自己:

class MyNonCsrfProvider extends DefaultCsrfProvider{ 
    public function isCsrfTokenValid($intention, $token) 
    { 
     return true; 
    } 
} 

和控制器:

$this->createForm(new CustomFormType(), array(
    'csrf_provider' => new MyNonCsrfProvider() 
)); 

我還沒試過此我自己,但是這聽起來像一個可能的解決方案...

18

使用表單廠

對於那些誰想要建立在控制器的簡單形式:

$form = $this->container->get('form.factory') 
    ->createNamedBuilder(null, 'form', null, array('csrf_protection' => false)) 
    ->add('yourField','text', array(
     'label' => false, 
     'mapped' => false 
    )) 
    ->getForm(); 
4
public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults([ 
     'csrf_protection' => false, 
    ]); 
} 
1

使用t他在Symfony的形成工廠3

use Symfony\Component\Form\Extension\Core\Type\FormType; 

$form = $this->container->get('form.factory') 
    ->createNamedBuilder(null, FormType::class, null, array('csrf_protection' => false)) 
    ->add('yourField','text', array(
     'label' => false, 
     'mapped' => false 
    )) 
    ->getForm(); 

從米克的答案