我们已经成功配置了FOSUserBundle;登录,注册,重置密码等,都工作正常。
现在,我们希望将登录表单合并到我们的常规站点布局中,特别是将表单放入布局标题的右上角。如果我们只处理用户名和密码字段,这样做会很容易。但是,我们似乎无法弄清楚如何获取由FOSUserBundle服务生成的CSRF令牌:
$this->container->get('form.csrf_provider')->generateCsrfToken('authenticate');
我尝试在 Twig 扩展中调用上述内容,否则它可以正常工作,但显然扩展无法正确引用容器。
当然,有一些简单的方法可以在全球范围内获得FOSUserBundle CSRF代币吗?
谢谢!杰森
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') }}" />
您可以在其中一个控制器中定义这样的函数
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 SymfonyComponentHttpFoundationResponse;