10

我们已经成功配置了 FOSUserBundle;登录,注册,重置密码等,都工作得很好。

现在我们想将登录表单合并到我们的一般站点布局中,特别是将表单放入布局标题的右上角。如果我们只处理用户名和密码字段,这样做会很容易。然而,我们似乎无法弄清楚如何获得由 FOSUserBundle 服务生成的 CSRF 令牌:

$this->container->get('form.csrf_provider')->generateCsrfToken('authenticate');

我尝试在 Twig 扩展中调用上述内容,否则可以正常工作,但显然扩展无法正确引用容器。

肯定有一些简单的方法可以在全球范围内获取 FOSUserBundle CSRF 令牌吗?

谢谢!杰森

4

2 回答 2

44

Symfony 2.3:

一种可能的解决方案是将 csrf 提供程序定义为 Twig 全局变量,如下所示:

twig:
    globals:
        fos_csrf_provider: "@form.csrf_provider"

然后在你的布局中这样称呼它:

<input type="hidden" name="_csrf_token" value="{{ fos_csrf_provider.generateCsrfToken('authenticate') }}" />

所以你不需要调用任何控制器。

Symfony 2.4 及更高版本:

twig:
    globals:
        fos_csrf_provider: "@security.csrf.token_manager"

和:

<input type="hidden" name="_csrf_token" value="{{ fos_csrf_provider.refreshToken('authenticate') }}" />
于 2013-06-21T11:18:05.453 回答
6

您可以在其中一个控制器中定义这样的函数

public function getTokenAction()
{
    return new Response($this->container->get('form.csrf_provider')
                            ->generateCsrfToken('authenticate'));
}

然后将其嵌入到您的表单中

<input type="hidden" name="_csrf_token" value="{% render('YourBundle:YourController:getToken') %}" />

您还需要在控制器顶部包含以下内容:

use Symfony\Component\HttpFoundation\Response;
于 2012-06-06T06:47:47.940 回答