在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的确切参考。