2013-09-30 5 views
1

Я пишу backend-приложение, которое имеет внутреннюю аутентификацию запросов, поэтому мне не нужен CSRF - за исключением небольшого количества форм, которые фактически отображаются пользователю.symfony 2 csrf выборочное разрешение?

Поэтому я отключил CSRF в config.yml, но я хочу включить его для определенных форм. Согласно документации, это должны сделать трюк:

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

Не могли бы вы отправить файл прут? Обычно CSRF отсутствует, потому что если в шаблоне формы вы не хотите использовать поведение формы по умолчанию '{{form_widget (form)}}', вы должны поместить '{{form_rest (form)}}', чтобы получить введенный токен –

+0

. Я использую значение по умолчанию. – Tom

+0

Какую версию Symfony вы используете? – nni6

ответ

2

Проблема в том, что когда вы отключили CSRF в config.yml, вы сказали, что не хотите, чтобы 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

+0

Спасибо, это помогает мне понять, в чем проблема. Теперь, как это решить? Могу ли я включить расширение для конкретной формы или мне нужно глобально включить его, а затем отключить CSRF для каждой другой формы (я бы не хотел этого делать, есть еще много форм, которые не хотят CSRF)? – Tom

+0

Я обновил свой ответ с возможным решением. – nni6

+0

Спасибо. Мне все еще нужно спросить больше - я не хочу, чтобы это было включено внутри одного пакета. Мне действительно нужна CSRF, возможно, 3 или 4 формы и все остальные формы, даже внутри этого пакета, нет. Возможно, я использовал неправильные формы, используя их в клиент-серверной связи, где клиент знает, как формируется форма, и в основном отправляет ее, даже не запрашивая ее. – Tom

Смежные вопросы