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

时间:2012-03-27 10:09:41

标签: ajax symfony csrf

我正在构建一个移动应用程序,通过webservices与我的symfony2应用程序通话 我找不到在特定控制器/操作上禁用csrf保护的方法

我想将注册数据发布到此操作并使用sf2表单验证。我不会在我的移动应用程序中调用该表单

无法更改操作中的容器参数,因为它是冻结参数而抛出异常...

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

任何线索?

谢谢!

更新:使用symfony 2.1.x

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

5 个答案:

答案 0 :(得分:86)

如果您正在寻找比上面的答案中建议的更容易和更快的解决方案,请按以下方式进行:

<?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

答案 1 :(得分:20)

使用表单工厂

对于那些想要在控制器中创建简单表单的人:

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

答案 2 :(得分:6)

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

答案 3 :(得分:2)

使用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();

改编自Mick的回答

答案 4 :(得分:1)

我不能百分百肯定,但我想我在某处可以看到你可以在创建表单时传递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()
));

我自己没试过,但这听起来像是一种可能的解决方案......