Symfony CSRF令牌无效

时间:2014-03-29 20:30:03

标签: symfony doctrine-orm twig fosuserbundle

我的项目在我的本地计算机上运行良好。但是一旦我将它上传到OVH服务器上,当我提交任何表格(例如注册FOSUserBundle以及我自己的表格)时,我遇到了一些问题。

问题是当我提交表单时,我有一个无效的CSRF令牌。

我尝试了很多解决方案:

  • 我将{{ form_rest(form) }}添加到我的twig文件中。

  • 我在csrf_protection中将false更改为app/config/config.yml,然后提交请求时没有表单中的任何字段。

注意:我尝试使用symfony 2.4和2.3,但问题仍然存在。

我的树枝:

<form id="modifier_form" name="modifier_form" method="post" {{ form_enctype(form) }}>
    <div id="form_prenom">{{ form_row(form.prenom) }}</div>
    <div id="form_nom">{{ form_row(form.nom) }}</div>

    <div id="form_situation_pro">
        <label>Situation professionnelle</label>
        <select name="optone" 
                id="pays_select"
                onchange="setOptions(document.modifier_form.optone.options[document.modifier_form.optone.selectedIndex].value);">
                    <option value=" " selected="selected"> </option>
                    {% for a in pays  %}
                        <option value="{{ a.getId }}">{{ a.getName }}</option>
                    {% endfor %}
        </select>
    </div>
    <div id="form_situation_pro_sous">
        <label></label>
        <select name="opttwo" id="region_select">
            <option value=" " selected="selected"></option>
        </select>
    </div>

    {{ form_widget(form) }}
    {{ form_restt(form) }}
    <input type="submit" value="Enregistrer" />

我的控制器

public function modifierAction(){
    $connecteduser =$this->getUser();
    $fich=$connecteduser->getFichsig();
    //si l'utulisateur a deja une fiche sinon il faut le remplire
    if(!$fich){
        $fich = new Fichsig;
        $connecteduser->setFichsig($fich);
    }

    $myuser=$this->getDoctrine()
        ->getManager()
        ->getRepository('TS\InscriptionBundle\Entity\User')->findByEmail($connecteduser->getEmail());

    $form = $this->createForm(new UserType($this->getDoctrine()->getManager()), $connecteduser);

    $request = $this->getRequest();
    if ($request->isMethod('POST')) {
        $form->bindRequest($request);
        if ($form->isValid()) {
            //get parametres
            ////
            $connecteduser->setFichsig($fich);
            $em = $this->getDoctrine()->getManager();
            $em->merge($connecteduser);
            $em->flush();
            return $this->redirect($this->generateUrl('ts_inscription_profil'));
        }
    }
    // On passe la méthode createView() du formulaire à la vue afin qu'elle puisse afficher le formulaire toute seule
    return $this->render('TSInscriptionBundle:Logged:modifier_logged_layout.html.twig', array(
        'form' => $form->createView(),
        'pays'=>$this->pays(),
        'region'=>$this->region(),

    ));
}

我的config.yml

framework:
#esi:             ~
translator:      { fallback: "%locale%" }
secret:          "%secret%"
router:
    resource: "%kernel.root_dir%/config/routing.yml"
    strict_requirements: ~
form:            ~
csrf_protection: ~
validation:      { enable_annotations: true }
templating:
    engines: ['twig']
    #assets_version: SomeVersionScheme
default_locale:  "%locale%"
trusted_hosts:   ~
trusted_proxies: ~
session:
    # handler_id set to null will use default session handler from php.ini
    handler_id:  ~
fragments:       ~
http_method_override: true

3 个答案:

答案 0 :(得分:1)

你写了

  

{{form_restt(form)}}

应该是这样的:

  

{{form_rest(form)}}

并删除{{ form_widget(form) }}。它用于渲染表单的一部分。由于您已经提交了字段 form.prenom 。 form_rest将呈现其余字段。

快乐编码......

答案 1 :(得分:0)

一旦开始使用小部件,行和标签,您可以使用{{form(form)}}让枝条为您呈现它,然后您必须使用 {{form_start(form)} ,在提交按钮之后和 {{form_end(form)}} 之前,您应该添加 {{ form_rest(form)}}

我认为你错过了form_end并更正了form_rest,因为它有拼写错误

答案 2 :(得分:-1)

如果您使用symfony 2.3

,请设置表单结尾
{{ form_end(form, {'render_rest': false}) }}