2012-03-27 17 views
43

buduję aplikację mobilną mówi do mojego Symfony2 aplikacji za pośrednictwem serwisów internetowych nie mogę znaleźć sposób, aby wyłączyć ochronę CSRF na określonym kontrolerze/actionWyłącz Symfony 2 csrf żeton ochrona na AJAX przedłożyć

chcę przesłać dane rejestracyjne do tego działania i użyć sprawdzania formularza sf2. I nie nazywaj formę w mojej aplikacji mobilnej

nie można zmienić parametrów kontenerów w akcji, wyjątek, ponieważ jest to parametr mrożone ...

Nie chcę, aby wyłączyć ochronę formularz na całe aplikacja

jakaś wskazówka?

dziękuję!

zmiana: z symfony 2.1.x

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

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

+0

nie zrobił nie badamy więcej, ale używając typu formularza jako usługi musiałem używać rozwiązań SalmanPK, ponieważ domyślna opcja csrf_protection nie została rozpoznana. – tuxone

Odpowiedz

78

Jeśli szukasz rozwiązania łatwiejszego i szybszego niż sugerowane w powyższej odpowiedzi, oto jak:

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

.. lub jeśli używasz 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; 
    } 
} 

Skonsultuj się Symfony documentation o dodatkowe informacje.


Edit: zaktualizowane odpowiedź do najnowszej wersji Symfony, dzięki naitsirch

+0

Dzięki! Szukałem wdrożenia niestandardowego dostawcy csrf takiego jak @jperovic, ale twoje rozwiązanie działa i jest czyste :) –

+0

Zdecydowanie prostsze rozwiązanie! :) –

+0

Brak metody disableCSRFProtection() jak symfony 1. Naprawdę wygodnie w kontekście ajaxowym –

1

nie mogę być w 100% pewien, ale myślę, że czytałem gdzieś, że można przekazać csrf_provider opcję podczas tworzenia formularza.

Wszyscy dostawcy są podtypy interfejsu Symfony\Component\Form\Extension\Csrf\CsrfProvider i powinieneś być w stanie stworzyć swój własny:

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

i kontroler:

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

ja nie próbowałem to sobie, ale to brzmi jak możliwe rozwiązanie ...

18

Korzystanie z fabryki formularz

Dla tych, którzy chcą stworzyć prosty formularz w kontrolerze:

$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

Używanie t on tworzyć fabryki w 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(); 

Adaptacja odpowiedź Micka