2012-03-27 13 views
43

Sto costruendo un'applicazione per cellulare a parlare con il mio Symfony2 applicazione tramite webservices non riesco a trovare un modo per disabilitare la protezione CSRF in un controller specifico/azioneDisabilita symfony 2 csrf protezione token ajax presentare

voglio per registrare i dati di registrazione su questa azione e utilizzare la convalida del modulo sf2. Io non chiamo la forma nella mia app mobile

Impossibile modificare i parametri di container in azione, un'eccezione, perché è un parametro congelata ...

io non voglio disattivare la protezione forma per tutta la mia applicazione

alcun indizio?

grazie!

aggiornamento: con symfony 2.1.x

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

'$ form = $ this-> createForm ($ FormType, $ entità, array ('csrf_protection' => false));' –

+0

Didn 't indagare di più, ma utilizzando un tipo di modulo come un servizio ho dovuto usare le soluzioni di SalmanPK dal opzione predefinita csrf_protection non è stato riconosciuto. – tuxone

risposta

78

Se siete alla ricerca di un po 'la soluzione più semplice e veloce rispetto a quanto suggerito nella risposta di cui sopra, ecco come fare:

<?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 se si sta utilizzando 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; 
    } 
} 

Consultare il Symfony documentation per ulteriori informazioni.


Edit: risposta aggiornato alla versione più recente di Symfony, grazie naitsirch

+0

Grazie! stavo cercando di implementare un provider csrf personalizzato come @jperovic, ma la soluzione funziona ed è pulita :) –

+0

Soluzione decisamente più semplice! :) –

+0

manca un metodo disableCSRFProtection() come una symfony 1. Davvero comodo in un contesto Ajax –

1

non posso essere sicuro al 100%, ma penso che ho letto da qualche che è possibile passare csrf_provider opzione durante la creazione di form.

Tutti i fornitori sono sottotipi di interfaccia Symfony\Component\Form\Extension\Csrf\CsrfProvider e si dovrebbe essere in grado di creare il proprio:

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

e controller:

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

Non ho provato io stesso, ma questo suona come una possibile soluzione ...

18

Utilizzando il modulo di fabbrica

Per coloro che vogliono creare un semplice modulo in un controllore:

$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

Utilizzando t si formano fabbrica in 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(); 

Adattato dalla risposta di Mick