Symfony 4 - 如何在不构建表单的情况下添加csrf令牌?

Dar*_*s.V 6 forms symfony-forms symfony csrf-protection

我在这里阅读教程

https://symfony.com/doc/current/form/csrf_protection.html

如何添加csrf令牌.它说要使用

form_end()
Run Code Online (Sandbox Code Playgroud)

在模板中.但这不起作用,给出错误:

类型错误:函数Symfony\Component\Form\FormRenderer :: renderBlock()的参数太少,在E:\ projektai\php projektai\htdocs\mokomieji\symfony_4_demo\var\cache\dev\twig\bb\bb2248f7be504240fcc2ab43dabf593090ebc4c897ce72b1a979082d62914b47中传递0. php在48行,预计至少有2个

这里的答案显示了如何修复,但只有当你构建了表单对象时:

Symfony Type错误:函数FormRenderer :: renderBlock()的参数太少

没有表格对象怎么做?这是从登录文档页面登录:

{% if error %}
    <div>{{ error.messageKey|trans(error.messageData, 'security') }}</div>
{% endif %}

<form action="{{ path('login') }}" method="post">
    <label for="username">Username:</label>
    <input type="text" id="username" name="_username" value="{{ last_username }}" />

    <label for="password">Password:</label>
    <input type="password" id="password" name="_password" />

    <button type="submit">Login</button>

{{  form_end() }}
Run Code Online (Sandbox Code Playgroud)

Mat*_*teo 10

您可以使用此处csrf_token doc中描述的辅助树枝功能,例如:

 <input type="hidden" name="_csrf_token"
        value="{{ csrf_token('authenticate') }}"
    >
Run Code Online (Sandbox Code Playgroud)

这个答案更有帮助.

更新:

其他策略:从控制器传递:

    $tokenProvider = $this->container->get('security.csrf.token_manager');
    $token = $tokenProvider->getToken('example')->getValue();
Run Code Online (Sandbox Code Playgroud)

希望这有帮助

  • 这确实会产生错误:在渲染模板期间抛出异常(“只有在 FormRenderer::__construct() 中注入了 CsrfTokenManagerInterface 才能生成 CSRF 令牌。”)。 (2认同)

Sen*_*nce 5

您可以用来{{ form_row(form._token) }}在Symfony 3中为表单渲染生成所需的CSRF令牌字段(我目前在Symfony 3.4中使用此方法)。

  • 也可以在Symfony 4中使用 (2认同)