在ajax提交上禁用symfony 2 csrf令牌保护

我build立一个移动应用程序通过web服务与我的symfony2应用程序交谈我无法find一种方法来禁用特定的控制器/动作的csrf保护

我想发布注册数据到这个动作,并使用sf2表单validation。 我不会在我的移动应用程序中调用该表单

无法更改容器参数,抛出一个exception,因为它是一个冻结的参数…

我不想为整个应用程序禁用表单保护

任何线索?

谢谢 !

更新:用symfony 2.1.x

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

如果您正在寻找比上面的答案更简单快捷的解决scheme,请执行以下操作:

 <?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文档以获取更多信息。


编辑:更新最新的Symfony版本的答案,谢谢naitsirch

使用表单工厂

对于那些想要在控制器中创build简单表单的用户:

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

我不能100%确定,但我想我读了一些地方,你可以通过csrf_provider选项,同时创build窗体。

所有提供者都是Symfony\Component\Form\Extension\Csrf\CsrfProvider接口的子types,您应该可以创build自己的:

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

并在控制器中:

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

我没有尝试过这个,但这听起来像是一个可能的解决scheme…

在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(); 

改编自米克的答案

如果有人正在关注FOSRestBundle文档,请在此处提供关于禁用CSRF保护function的确切参考。

https://github.com/FriendsOfSymfony/FOSRestBundle/blob/master/Resources/doc/2-the-view-layer.md#csrf-validation