Symfony2 FOSUser/ sonatbundle CSRF令牌值无效


Symfony2 FOSUser/SonataBundle invalid CSRF token value

我想有两个不同的(不同的我的意思是模板)表单,可以登录我的用户在不同的分支。但我得到一个错误,从我的形式之一…这是我一步一步做的:

我有路由/login的主登录模板。.

为了使第二种形式在/product_frm中工作,我这样做了:

1)为第二个登录控制器创建路由。现在我有两个登录路由:

login:  
    path: /login
    defaults: { _controller: ApplicationSonataUserBundle:SecurityFOSUser1:login }
loginForm:
    path: /login_frm
    defaults: { _controller: ApplicationSonataUserBundle:LoginFormType:login }

现在这是/login_frm的控制器,它与/login控制器相同,只是呈现的模板不同:

<?php
/*
 * This file is part of the Sonata package.
 *
 * (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Application'Sonata'UserBundle'Controller;
use FOS'UserBundle'Controller'SecurityController;
use Sonata'UserBundle'Model'UserInterface;
use Symfony'Component'HttpFoundation'RedirectResponse;
use Sonata'UserBundle'Controller'SecurityFOSUser1Controller as BaseController;

class LoginFormTypeController extends BaseController
{
    public function loginAction()
    {
        $user = $this->container->get('security.context')->getToken()->getUser();
        if ($user instanceof UserInterface) {
            $this->container->get('session')->getFlashBag()->set('sonata_user_error', 'sonata_user_already_authenticated');
            $url = $this->container->get('router')->generate('sonata_user_profile_show');
            return new RedirectResponse($url);
        }
        return parent::loginAction();
    }
    public function renderLogin(array $data)
    {
        $template = sprintf('MpShopBundle:Form:login_form2.html.%s', $this->container->getParameter('fos_user.template.engine'));
        return $this->container->get('templating')->renderResponse($template, $data);
    }
}
最后,我制作了加载表单的模板:
{% block fos_user_content %}
    <div class="span9">
        <div class="well">
            {% block sonata_user_login %}
                <div class="panel panel-info">
                <div class="panel-heading">
                    <h2 class="panel-title">{{ 'title_user_authentication'|trans({}, 'SonataUserBundle') }}</h2>
                </div>
                <div class="panel-body">
                    {% block sonata_user_login_error %}
                        {% if error %}
                            <div class="alert alert-danger alert-error">{{ error|trans({}, 'FOSUserBundle') }}</div>
                        {% endif %}
                    {% endblock %}
                    {% block sonata_user_login_form %}
                        <form action="{{ path("fos_user_security_check") }}" method="post" role="form"
                              class="form-horizontal">
                            <input type="hidden" name="_csrf_token" value="{{ csrf_token }}"/>
                            <div class="control-group">
                                <label class="control-label control-label required" for="username"
                                       class="col-sm-4 control-label">{{ 'security.login.username'|trans({}, 'SonataUserBundle') }}</label>
                                <div class="controls">
                                <input type="text" class="form-control" id="username" name="_username" value="{{ last_username }}" required="required"/></div>
                            </div>

                            <div class="form-group control-group">
                                <label class="control-label control-label required" for="password"
                                       class="col-sm-4 control-label">{{ 'security.login.password'|trans({}, 'SonataUserBundle') }}</label>
                                <div class="controls">
                                <input type="password" class="form-control" id="password" name="_password" required="required"/></div>
                            </div>
                            <div class="control-group">
                                <div class="col-sm-offset-4 col-sm-8">
                                    <div class="checkbox control-group">
                                        <label class="checkbox pull-left" for="remember_me">
                                            <input type="checkbox" id="remember_me" name="_remember_me" value="on"/>
                                            {{ 'security.login.remember_me'|trans({}, 'FOSUserBundle') }}
                                        </label>
                                    </div>
                                </div>
                            </div>
                            <div class=" control-group pull-left">
                                <div class="">
                                    <a href="{{ path('forgetpass') }}">{{ 'forgotten_password'|trans({}, 'SonataUserBundle') }}</a>
                                </div>
                            </div>
                            <div class="form-actions">
                                <div class="pull-left">
                                    <input type="submit" id="_submit" name="_submit" class="btn btn-primary pull-right"
                                           value="{{ 'security.login.submit'|trans({}, 'FOSUserBundle') }}"/>
                                </div>
                            </div>
                        </form>
                    {% endblock %}
                </div>
            </div>
            {% endblock %}
        </div>
       </div>
{% endblock fos_user_content %}

完整的错误:如果我尝试登录/login_frm,我得到Invalid CSRF token.错误。如果我从/login登录,它工作得很好。为什么呢?我可以有两个表单登录吗?

因为在标准表单中您有CSRF令牌,而在自定义表单中您没有。

你应该添加{{ form_widget(form._token) }}在你的HTML在twig的表单块