Spring Security 4 JTwig将CSRF令牌放在表单中

问题描述 投票:0回答:1

如何使用JTwig将CSRF令牌放入表单中?

我尝试了this扩展但它不起作用(显示有关{%csrf%}的错误没有结束块)。此外,我尝试将HttpServletRequest对象放在模型中,然后使用this片段获取令牌,但它根本没有任何效果。

即使没有模板引擎,是否有一些通用的方法来实现csrf-token?

java spring-mvc spring-security csrf jtwig
1个回答
1
投票

以下代码对我有用:

我创建了一个名为ControllerSetup的类(或者您可以将它命名为任何名称),然后将其放在与我的Application类相同的文件夹中(使用public static void main()方法的文件夹)。代码如下:

package some.pkg.of.myapp;

import javax.servlet.http.HttpServletRequest;

import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;

@ControllerAdvice
public class ControllerSetup {

    @ModelAttribute
    public void initModel(HttpServletRequest request, Model model) {
        model.addAttribute("_csrf", request.getAttribute("_csrf"));
    }

}

现在,我的任何控制器中的任何模型都会自动拥有一个名为_csrf的属性。我会在我的JTwig表单中使用它,如下所示:

<form method="post" action="/some/action/url">
    <!-- My fields and buttons here -->

    <input type="hidden"
           name="{{ _csrf.parameterName }}" value="{{ _csrf.token }}" />
</form>
© www.soinside.com 2019 - 2024. All rights reserved.