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,
));
}
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
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();
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'csrf_protection' => false,
]);
}
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
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...