我正在编写一个对请求进行内部身份验证的后端应用程序,因此我不需要CSRF - 除了少量实际向用户公开的表单。
所以我在config.yml中禁用了CSRF,但我想为特定表单启用它。根据文档,这应该做的伎俩:
public function setDefaultOptions(OptionsResolverInterface $resolver) {
$resolver->setDefaults(array(
// FIXME: this doesn't work, I still don't get CSRF ?
'csrf_protection' => true,
'csrf_field_name' => '_token',
));
}
但事实并非如此,我仍然没有以这种形式获得CSRF令牌。我的枝条文件说:
<form action="{{ path('mypath') }}" method="post" {{ form_enctype(form) }}>
{{ form_widget(form) }}
<button name="submit">{{ 'register.submit'|trans }}</button>
</form>
这也应该有效。有什么问题?
答案 0 :(得分:2)
问题是当您在config.yml中禁用CSRF时,您说您不希望在项目中加载CSRFExtension。你刚刚以“全球方式”禁用了它。所以你不能在那之后使用它。
您可以在代码中看到它是如何完成的:
Symfony\Bundle\FrameworkBundle\DependencyInjection\FrameworkExtension::registerFormConfiguration($config, ContainerBuilder $container, XmlFileLoader $loader)
。
您可以看到,在您的情况下,此行返回false。
$this->isConfigEnabled($container, $config['csrf_protection']) // this returns false
因此未加载CSRFExtension。
如果你没有得到config.yml和扩展之间的关系,请在这里阅读它的工作原理:http://symfony.com/doc/current/cookbook/bundles/extension.html