Я создаю мобильное приложение, разговаривающее с моим приложением symfony2 через webservices Я не могу найти способ отключить защиту 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.
Изменить: обновленный ответ на последнюю версию 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()
));
Я не пробовал это сам, но это похоже на возможное решение...
$form = $this->createForm($formType, $entity, array('csrf_protection' => false));