我正在建立一个移动应用程序通过webservices与我的symfony2应用程序交谈我无法找到一种方法来禁用特定控制器/操作上的csrf保护
我想将注册数据发布到此操作并使用sf2表单验证。我不会在我的移动应用程序中调用该表单
无法更改操作中的容器参数,因为它是一个冻结参数而抛出异常...
我不想为整个应用程序禁用表单保护
任何线索?
谢谢 !
更新:使用symfony 2.1.x
/**
* {@inheritdoc}
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'csrf_protection' => false,
));
}
如果您正在寻找比上面的答案中建议的更简单,更快速的解决方案,请按以下步骤操作:
<?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
对于那些想要在控制器中创建简单表单的人:
$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,
]);
}
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();
改编自米克的答案
我不能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()
));
我自己没试过,但这听起来像是一个可能的解决方案......