Désactiver symfony 2 csrf token protection sur ajax soumettre

Je construis une application mobile en parlant à mon application symfony2 via des services web Je ne trouve pas de moyen de désactiver la protection csrf sur un contrôleur/action spécifique

Je veux publier des données d'enregistrement dans cette action et utiliser la validation du formulaire sf2. Je n'appelle pas le formulaire dans mon application mobile

Impossible de modifier les paramètres du conteneur en action, lancez une exception car il s'agit d'un paramètre gelé...

Je ne veux pas désactiver la protection de formulaire pour l'ensemble de mon application

Tout indice ?

Merci !

Mise à Jour: avec symfony 2.1.x

/**
 * {@inheritdoc}
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'csrf_protection'   => false,
    ));
}
48
demandé sur Julien Rollin 2012-03-27 14:09:40

5 réponses

Si vous cherchez une solution un peu plus facile et plus rapide que celle suggérée dans la réponse ci-dessus, voici comment:

<?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,
        ));
    }
}

.. ou si vous utilisez des versions plus anciennes (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;
    }
}

Consultez la documentation Symfony pour plus d'informations.


Edit: réponse mise à jour à la dernière version de Symfony, merci naitsirch

84
répondu Inoryy 2018-09-17 13:44:09

Utilisation de la fabrique de formulaires

Pour ceux qui veulent créer un formulaire simple dans un contrôleur:

$form = $this->container->get('form.factory')
    ->createNamedBuilder(null, 'form', null, array('csrf_protection' => false))
    ->add('yourField','text', array(
        'label' => false,
        'mapped' => false
    ))
    ->getForm();
19
répondu Mick 2014-04-11 19:25:34
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'csrf_protection' => false,
    ]);
}
5
répondu luchaninov 2016-06-24 11:29:03

Utilisation de la fabrique de formulaires dans 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();

Adapté de la réponse de Mick

2
répondu Nicodemuz 2016-07-25 14:30:04

Je ne peux pas être sûr à 100% mais je pense avoir lu quelque part que vous pouvez passer l'option csrf_provider lors de la création du formulaire.

Tous les fournisseurs sont des sous-types d'interface Symfony\Component\Form\Extension\Csrf\CsrfProvider et vous devriez pouvoir créer les vôtres:

class MyNonCsrfProvider extends DefaultCsrfProvider{
    public function isCsrfTokenValid($intention, $token)
    {
        return true;
    }
}

Et dans le contrôleur:

$this->createForm(new CustomFormType(), array(
    'csrf_provider' => new MyNonCsrfProvider()
));

Je n'ai pas essayé moi-même mais cela semble être une solution possible...

1
répondu Jovan Perovic 2012-03-27 11:45:18