web-dev-qa-db-ja.com

Ajaxサブミットでsymfony 2 csrfトークン保護を無効にする

特定のコントローラー/アクションでcsrf保護を無効にする方法を見つけることができないWebサービスを介してsymfony2アプリと通信するモバイルアプリを構築しています

このアクションに登録データを投稿し、sf2フォーム検証を使用したいと思います。モバイルアプリでフォームを呼び出さない

アクションでコンテナのパラメータを変更することはできません。凍結されたパラメータであるため、例外をスローします...

アプリケーション全体でフォーム保護を無効にしたくない

どんな手掛かり ?

ありがとう!

更新:symfony 2.1.xを使用

/**
 * {@inheritdoc}
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'csrf_protection'   => false,
    ));
}
52
Julien Rollin

上記の回答で提案されているよりも少し簡単で高速なソリューションを探している場合は、次の方法があります。

<?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

86
Inoryy

フォームファクトリを使用する

コントローラーでシンプルなフォームを作成したい場合:

$form = $this->container->get('form.factory')
    ->createNamedBuilder(null, 'form', null, array('csrf_protection' => false))
    ->add('yourField','text', array(
        'label' => false,
        'mapped' => false
    ))
    ->getForm();
20
Mick
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'csrf_protection' => false,
    ]);
}
7
luchaninov

Symfony 3でフォームファクトリを使用する

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();

ミックの答えから改編

2
Nicodemuz

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()
));

私はこれを試していませんが、これは可能な解決策のように聞こえます...

1
Jovan Perovic