【问题标题】:Symfony2 FOSUser/SonataBundle invalid CSRF token valueSymfony2 FOSUser/SonataBundle 无效的 CSRF 令牌值
【发布时间】:2015-08-04 09:09:42
【问题描述】:

我想要两个不同的(不同的,我指的是模板)表单,可以让我的用户在不同的树枝上登录。但是我从我的一个表单中得到了一个错误......这是我一步一步做的:

我在路由/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 登录,它工作正常。这是为什么?我不能有两个表单来登录吗?

【问题讨论】:

标签: php forms symfony login fosuserbundle


【解决方案1】:

因为在标准形式中你有 CSRF 令牌,而在你的自定义形式中你没有。

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

【讨论】:

  • 他有 "" 这对 fosuser 来说很好
  • 输入名称_csrf_token,但是表单名称呢?试试我的解决方案。我认为它会生成另一个名称的输入。
猜你喜欢
  • 2015-10-25
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
  • 2015-04-04
  • 2020-01-02
相关资源
最近更新 更多