Symfony:使CSRF令牌可用于所有细枝模板
我的应用程序到处都有AJAX请求,我想用CSRF令牌保护它们。但是,我不希望生成CSRF令牌并将其传递给Twig渲染器以便在JavaScript中使用,而是希望Twig渲染的每个html页面中都可以使用CSRF令牌 我看到Laravel似乎把它放在一个元标记中,所以我可以用JavaScript轻松地获取它。但在Symfony中如何做到这一点?如何在每页中插入此令牌Symfony:使CSRF令牌可用于所有细枝模板,symfony,twig,csrf,Symfony,Twig,Csrf,我的应用程序到处都有AJAX请求,我想用CSRF令牌保护它们。但是,我不希望生成CSRF令牌并将其传递给Twig渲染器以便在JavaScript中使用,而是希望Twig渲染的每个html页面中都可以使用CSRF令牌 我看到Laravel似乎把它放在一个元标记中,所以我可以用JavaScript轻松地获取它。但在Symfony中如何做到这一点?如何在每页中插入此令牌 或者这不是一个好的做法?答案是:将其作为一个twig全局变量插入,然后使用Javascript将其绑定到所有请求 config.ym
或者这不是一个好的做法?答案是:将其作为一个twig全局变量插入,然后使用Javascript将其绑定到所有请求 config.yml
twig:
## ...
globals:
csrfTokenManager: '@security.csrf.token_manager'
base.html.twig
<script>
$.ajaxSetup({
beforeSend: function(xhr) {
xhr.setRequestHeader('x-csrf-token', '{{ csrfTokenManager.getToken('ajaxAuth') }}');
});
</script>
当然这是一个很好的实践 您在symfony/twig中有内置的函数
csrf\u token('key')
例如:
<a href="{{ path('product_remove', {id: product.id, csrf: csrf_token('product') }) }}"
class="btn btn-info">Remove</a>
为什么需要它?我需要它来保护我的AJAX请求。找到它,我可以在config.yml中将tokenmanager作为twig全局变量插入,然后从TemplateNooo中调用tokenmanager~你是认真的吗?我整个下午都在网上搜索,我觉得插入服务,然后再打电话是非常聪明的。结果我所要做的就是在Twig中调用csrf_token()。不知道我是怎么错过的。稀罕所有的东西。编辑:我是说谢谢你!在任何地方使用相同的令牌id可以吗?如果令牌id参数在任何地方都相同,那么它的意义是什么?
<a href="{{ path('product_remove', {id: product.id, csrf: csrf_token('product') }) }}"
class="btn btn-info">Remove</a>
/**
* @Route("/product/remove/{csrf}/{id}", name="product_remove")
*/
public function removeProductAction($csrf, $id)
{
if ($csrf !== $this->get('security.csrf.token_manager')->getToken('product')->getValue()) {
throw new InvalidCsrfTokenException('Invalid CSRF token');
}
// delete $id
// cleans up url
return $this->redirectToRoute('product_list');
}