Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony:使CSRF令牌可用于所有细枝模板_Symfony_Twig_Csrf - Fatal编程技术网

Symfony:使CSRF令牌可用于所有细枝模板

Symfony:使CSRF令牌可用于所有细枝模板,symfony,twig,csrf,Symfony,Twig,Csrf,我的应用程序到处都有AJAX请求,我想用CSRF令牌保护它们。但是,我不希望生成CSRF令牌并将其传递给Twig渲染器以便在JavaScript中使用,而是希望Twig渲染的每个html页面中都可以使用CSRF令牌 我看到Laravel似乎把它放在一个元标记中,所以我可以用JavaScript轻松地获取它。但在Symfony中如何做到这一点?如何在每页中插入此令牌 或者这不是一个好的做法?答案是:将其作为一个twig全局变量插入,然后使用Javascript将其绑定到所有请求 config.ym

我的应用程序到处都有AJAX请求,我想用CSRF令牌保护它们。但是,我不希望生成CSRF令牌并将其传递给Twig渲染器以便在JavaScript中使用,而是希望Twig渲染的每个html页面中都可以使用CSRF令牌

我看到Laravel似乎把它放在一个元标记中,所以我可以用JavaScript轻松地获取它。但在Symfony中如何做到这一点?如何在每页中插入此令牌


或者这不是一个好的做法?

答案是:将其作为一个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');
}