2012-03-27 12 views
43

estoy construyendo una aplicación móvil hablando con mi aplicación Symfony2 a través de servicios web no puedo encontrar una manera de desactivar la protección CSRF en un controlador específico/acciónSymfony 2 Desactivar la protección CSRF ficha en ajax presentar

quiero para publicar datos de registro en esta acción y usar la validación de formulario sf2. Yo no llamo a la forma en mi aplicación móvil

no puede cambiar los parámetros de contenedores en acción, una excepción, ya que es un parámetro congelada ...

no quiero para desactivar la protección para toda forma de mi aplicación

¿alguna pista?

gracias!

actualización con 2.1.x Symfony

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

'$ form = $ this-> createForm ($ formType, $ entidad, array ('csrf_protection' => false));' –

+0

Didn No investigo más, pero al usar un tipo de formulario como servicio tuve que usar las soluciones de SalmanPK ya que la opción predeterminada csrf_protection no fue reconocida. – tuxone

Respuesta

78

Si está buscando una solución un poco más fácil y más rápida que la sugerida en la respuesta anterior, así es como:

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

.. o si está usando 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; 
    } 
} 

Consulte al Symfony documentation para obtener información adicional.


Editar: respuesta actualizada a la última versión de Symfony, gracias naitsirch

+0

¡Gracias! estaba buscando implementar un proveedor de csrf personalizado como @jperovic, pero su solución funciona y está limpia :) –

+0

¡Solución definitivamente más simple! :) –

+0

falta un método disableCSRFProtection() como un Symfony 1. Muy conveniente en contexto ajax –

1

no puedo estar 100% seguro, pero creo que he leído por ahí que puede pasar csrf_provider opción durante la creación de la forma.

Todos los proveedores son subtipos de interfaz Symfony\Component\Form\Extension\Csrf\CsrfProvider y usted debería ser capaz de crear su propia:

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

y en el controlador:

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

no he probado esto por mí mismo, pero esto suena como una posible solución ...

18

Uso de la fábrica forma

Para aquellos que quieren crear una forma simple en un controlador:

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

Usando t que forman fábrica en 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(); 

Adaptado de la respuesta de Mick

Cuestiones relacionadas