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

roi*_*uez 6 symfony fosuserbundle

我正在使用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 );
    }
}
Run Code Online (Sandbox Code Playgroud)

视图:

<ul class="nav navbar-nav navbar-right">
{% if app.user and app.user.isGranted('IS_AUTHENTICATED_FULLY') %}
    {% include 'CustomUserBundle:Default:includes/navigation-authenticated.html.twig' %}
{% else %}
    {% include 'CustomUserBundle:Default:includes/navigation-notauthenticated.html.twig' with {'csrf_token': csrf_token, 'last_username': last_username} %}
{% endif %}
</ul>
Run Code Online (Sandbox Code Playgroud)

未经身份验证的模板:

<li><a href="{{ path('fos_user_registration_register') }}">Nueva cuenta</a></li>
<li class="dropdown"><a href="#" class="dropdown-toggle"
    data-toggle="dropdown">Ingresar <b class="caret"></b></a>
    <div class="dropdown-menu dd-login-form-container">

        <!-- login form -->
        <form role="form" method="post"
            action="{{ path("fos_user_security_check") }}">
            <input type="hidden" name="_csrf_token" value="{{ csrf_token }}" />
......
            <button type="submit" class="btn btn-primary">Ingresa!</button>
        </form>
        <!-- end login form -->
        <ul>
            <li><a href="{{ path('fos_user_resetting_request') }}">¿Has olvidado
                    tu contraseña?</a></li>
            <li><a href="{{ path('fos_user_registration_register') }}">¿Todavía
                    no tienes una cuenta?</a></li>
        </ul>
    </div>
</li>
Run Code Online (Sandbox Code Playgroud)

我错过了什么?另外:这个下拉菜单也会在/ login中呈现,在那里生成令牌两次会有什么问题吗?

kin*_*ing 12

我的自定义登录表单给了我同样的问题 - "无效的CSRF令牌" - 我尝试登录的任何时候.在浏览了FOSUserBundle配置选项(FOSUserBundle配置参考)的文档后,我发现该捆绑包启用了不同的令牌管理器默认情况下.所以我转到我的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
Run Code Online (Sandbox Code Playgroud)

执行此操作后,我的登录表单开始工作,我可以登录.


Aer*_*dir 5

以下是此问题的最佳和最干净的解决方案:将csrf提供程序设置为Twig全局变量:https://stackoverflow.com/a/17233953/1399706

  • 你暗示这个问题是重复的吗?:-) (3认同)

Pim*_*Web 2

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

<form action="{{ path('yourRoute') }}" method="post" {{ form_enctype(form) }}>
Run Code Online (Sandbox Code Playgroud)

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

您应该看看http://symfony.com/doc/current/reference/forms/twig_reference.html#form-enctype-view,因为这种方式很快就会被删除......