特定のコントローラー/アクションでcsrf保護を無効にする方法を見つけることができないWebサービスを介してsymfony2アプリと通信するモバイルアプリを構築しています
このアクションに登録データを投稿し、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()
));
私はこれを試していませんが、これは可能な解決策のように聞こえます...