Symfony 我自己的登录表单上的CSRF令牌无效

Symfony 我自己的登录表单上的CSRF令牌无效,symfony,fosuserbundle,Symfony,Fosuserbundle,我正在使用FOSUserBundle开发一个symfony应用程序。如果我没有经过身份验证,我希望在菜单栏中有一个下拉登录表单,它的样式与/login下的完全不同 我收到“无效的CSRF令牌”。我对symfony2完全是个新手,所以也许我犯了一个明显的错误,但我在谷歌上找不到解决办法。这就是我所尝试的: 控制器: <?php namespace RoiRodriguez\CustomUserBundle\Controller; use Symfony\Bundle\FrameworkB

我正在使用FOSUserBundle开发一个symfony应用程序。如果我没有经过身份验证,我希望在菜单栏中有一个下拉登录表单,它的样式与/login下的完全不同

我收到“无效的CSRF令牌”。我对symfony2完全是个新手,所以也许我犯了一个明显的错误,但我在谷歌上找不到解决办法。这就是我所尝试的:

控制器:

<?php

namespace RoiRodriguez\CustomUserBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\SecurityContext;

class DefaultController extends Controller {

    /**
     * Para requests internos, renderiza la barra de navegación.
     * No tiene ruta.
     */
    public function navigationAction() {
        $params = array (
                'csrf_token' => '',
                'last_username' => '' 
        );

        if ($this->container->get ( 'security.context' )->isGranted ( 'IS_AUTHENTICATED_FULLY' )) {
            $session = $this->getRequest ()->getSession ();
            $params ['last_username'] = (null === $session) ? '' : $session->get ( SecurityContext::LAST_USERNAME );
            $params ['csrf_token'] = $this->container->get ( 'form.csrf_provider' )->generateCsrfToken ( 'authenticate' );
        }

        return $this->render ( 'CustomUserBundle:Default:navigation.html.twig', $params );
    }
}

我过去也遇到过同样的问题

<form action="{{ path('yourRoute') }}" method="post" {{ form_enctype(form) }}>

CSRF令牌无效,因为我没有插入
{{form_enctype(form)}


你应该看看,因为这种方式很快就会被删除…

@Roirodriguez,你的代码帮助我解决这个问题。我认为您只需要调用render方法而不是include(我的步骤4)

我想在我的标题上做一个简单的登录表单,如果发生任何错误,它会将您重定向到提供反馈的FOSUserBundle普通登录页面。在用户通过身份验证后,我想要一个带有用户名的下拉列表,当打开时会显示更多选项(注销链接等)

以下是我如何让它工作的:

  • 创建了FOSUserBundle的子包。我创建了一个新的bundle名称UserBundle,然后使用get parent方法

  • 嵌入控制器动作最后,我通过细枝模板嵌入/渲染了这个新创建的控制器动作

    
    {%block login%}
    {%if_被授予(“被_认证了吗”)%}
    {%render(控制器(“MeUserBundle:Security:authenticatedDropdown”))%}
    {%else%}
    {%render(controller(“MeUserBundle:Security:loginHorizontal”))%}
    {%endif%}
    {%endblock%}
    
  • 我知道你发帖子已经有一段时间了,但希望这能有所帮助

    干杯,
    Pancho

    这里是解决此问题的最佳和最干净的解决方案:将csrf提供程序设置为一个Twig全局变量:

    我的自定义登录表单在我尝试登录时给了我相同的问题—“无效的csrf令牌”。在阅读了FOSUserBundle configuration options()的文档之后,我发现该捆绑包默认启用不同的令牌管理器。因此,我转到security.yml文件,注释掉了为登录表单指定csrf令牌生成器的行

    下面是我的app/config/security.yml文件的横截面,其中的配置指定了crsf令牌管理器注释输出

    security:
    
    .......
    
    firewalls:
    
        ........
    
        vendor:
            pattern: ^/vendor
            form_login:
                provider: fos_userbundle
            #   csrf_token_generator: security.csrf.token_manager
                login_path: vendor_login
                check_path: vendor_login_check
            logout: true
    

    完成此操作后,我的登录表单开始工作,我可以登录。

    在覆盖登录模板时,我在使用symfony 4和FOSUserBundle搜索解决方案时遇到了此主题

    对我来说,以下几点起了作用:

    在login_content.html.twig中,我发现:

    {% if csrf_token %}
            <input type="hidden" name="_csrf_token" value="{{ csrf_token }}" />
    {% endif %}
    
    {%if csrf_令牌%}
    {%endif%}
    
    我已将其替换为:

    {% if csrf_token('authenticate') %}
    <input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}" />
    {% endif %}
    
    {%if-csrf_令牌('authenticate')%}
    {%endif%}
    
    注意:额外的“('authenticate')”

    现在我得到了一个crsf代币。在这之前是空的


    希望这也能对其他人有所帮助。

    我对Symfony很陌生,但您能否尝试将csrf_token设置为false,也许它会起作用。的可能重复您是否暗示此问题是重复的?:-)@土豆条。谢谢这正是我需要的。奇怪的是,在我创建这个项目一年后,它才开始给我出问题。
    {#loginHorizontal.html.twig#}
    
    {% trans_default_domain 'FOSUserBundle' %}
    <div class="nav navbar-nav navbar-right">
    <form  class="navbar-form navbar-left form-inline" action="{{ path("fos_user_security_check") }}" method="post" role="form" >
        <input type="hidden" name="_csrf_token" value="{{ csrf_token }}" />
        <div class="form-group">
            <div class="input-group">
                <div class="input-group-addon"><i class="fa fa-user" ></i></div>
                <input type="text" class="form-control" id="txt_username"
                       placeholder="{{ 'security.login.username'|trans }}" name="_username"
                       value="{{ last_username }}" required="required" >
            </div>
        </div>
        <div class="form-group">
            <div class="input-group">
                <div class="input-group-addon"><i class="fa fa-asterisk" ></i></div>
                <input type="password"  class="form-control" id="txt_pwd" name="_password" required="required" placeholder="{{ 'security.login.password'|trans }}" />
            </div>
    
        </div>
        <input type="submit" id="_submit" name="_submit"  class="btn btn-primary" value="{{ 'security.login.submit'|trans }}" />
        <br />
        <div class="checkbox">
            <label>
                <input type="checkbox" id="remember_me" name="_remember_me" value="on" /> {{ 'security.login.remember_me'|trans }}
            </label>
        </div>
    </form>
    </div>
    
    
    
    {#authenticadedDropdown.html.twig#}
    
    {% trans_default_domain 'FOSUserBundle' %}
    <ul class="nav navbar-nav navbar-right" >
        <li class="dropdown">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown"> welcome, {{ app.user.username }}<span class="caret"></span></a>
            <ul class="dropdown-menu" role="menu">
                <li><a href="#">bla bla</a></li>
                <li class="divider"></li>
                <li><a href="{{ path('fos_user_security_logout') }}">
                    {{ 'layout.logout'|trans({}, 'FOSUserBundle') }}
                </a></li>
            </ul>
        </li>
        <li></li>
    </ul>
    
    namespace Me\UserBundle\Controller;
    
    use FOS\UserBundle\Controller\SecurityController as BaseController;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\Security\Core\SecurityContextInterface;
    
    
    class SecurityController extends BaseController
    {
        /**
         * For internal template use: Renders the Horizontal Login ej. Header bar login.
         * No routing used.
         */
        public function loginHorizontalAction(Request $request)
        {
            /** @var $session \Symfony\Component\HttpFoundation\Session\Session */
            $session = $request->getSession();
    
            // last username entered by the user
            $lastUsername = (null === $session) ? '' : $session->get(SecurityContextInterface::LAST_USERNAME);
    
            $csrfToken = $this->container->has('form.csrf_provider')
                ? $this->container->get('form.csrf_provider')->generateCsrfToken('authenticate')
                : null;
    
            $data =  array(
                'last_username' => $lastUsername,
                'csrf_token' => $csrfToken,
            );
            return $this->container->get('templating')->renderResponse('MeUserBundle:Security:loginHorizontal.html.twig', $data);
        }
    
        /**
         * For internal template use: Renders the Dropdown after authentication ej. Header bar for user.
         * No routing used.
         */
        public function authenticatedDropdownAction()
        {
            $data =  array();
            return $this->container->get('templating')
                ->renderResponse('MeUserBundle:Security:authenticatedDropdown.html.twig', $data);
        }
    }
    
    <div class="navbar-right" >
        {% block login %}
            {% if is_granted("IS_AUTHENTICATED_REMEMBERED") %}
                {% render(controller("MeUserBundle:Security:authenticatedDropdown")) %}
            {% else %}
                {% render(controller("MeUserBundle:Security:loginHorizontal")) %}
            {% endif %}
        {% endblock %}
    </div>
    
    security:
    
    .......
    
    firewalls:
    
        ........
    
        vendor:
            pattern: ^/vendor
            form_login:
                provider: fos_userbundle
            #   csrf_token_generator: security.csrf.token_manager
                login_path: vendor_login
                check_path: vendor_login_check
            logout: true
    
    {% if csrf_token %}
            <input type="hidden" name="_csrf_token" value="{{ csrf_token }}" />
    {% endif %}
    
    {% if csrf_token('authenticate') %}
    <input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}" />
    {% endif %}