Java 如何使用带胡子的弹簧安全?

Java 如何使用带胡子的弹簧安全?,java,spring-mvc,spring-security,mustache,Java,Spring Mvc,Spring Security,Mustache,我遵循Spring安全性参考,并重定向到一个自定义登录页面,如中所述。但是,我不确定如何在Mustache中获取CSRF令牌(所有示例都使用JSP)。我试过一些像这样天真的事情 {{#_csrf}} <input type="hidden" name="{{parameterName}}" value="{{token}}"/> {{/_csrf}} {{{{u csrf} {{/{u csrf} …还有这个 {{#CsrfToken}} <input ty

我遵循Spring安全性参考,并重定向到一个自定义登录页面,如中所述。但是,我不确定如何在Mustache中获取CSRF令牌(所有示例都使用JSP)。我试过一些像这样天真的事情

{{#_csrf}}
    <input type="hidden" name="{{parameterName}}" value="{{token}}"/>
{{/_csrf}}
{{{{u csrf}
{{/{u csrf}
…还有这个

{{#CsrfToken}}
    <input type="hidden" name="{{parameterName}}" value="{{token}}"/>
{{/CsrfToken}}
{{{CsrfToken}
{{/CsrfToken}
……但它们不起作用(我也没料到它们会起作用)。如何在Mustache中获取CSRF令牌


我还想知道:在我的代码中哪里可以设置断点,以查看Spring Security将什么作为模型发送到我的自定义登录视图?

我不确定这是从哪个版本提供的,但您可以在控制器方法上为
CsrfToken
添加一个参数,以便将令牌传递到模型中,如下所示:

@GetMapping("/dashboard")
public String dashboard(CsrfToken csrfToken, Model model) {
    model.addAttribute("_csrf", csrfToken);
    // render page
}
您不必使用
HttpServletRequest
。现在您可以使用第一个模板


如果对每个控制器方法执行上述操作过于繁琐,我们可以注册一个拦截器

拦截器:

public class CsrfTokenInterceptor implements HandlerInterceptor {
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response,
                           Object handler, ModelAndView modelAndView) throws Exception {
        CsrfToken csrfToken = (CsrfToken) request.getAttribute("_csrf");
        if (modelAndView != null) {
            modelAndView.addObject("_csrf", csrfToken);
        }
    }
}
豆子:

在WebMVCConfigure中添加拦截器:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Autowired
    CsrfTokenInterceptor csrfTokenInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(csrfTokenInterceptor);
    }
}

将其添加到
应用程序中。属性

spring.mustache.expose-request-attributes=true

然后您可以访问模板中的
\u csrf
请求属性。

Spring Security不发送模型;这就是Spring MVC
DispatcherServlet
。如果要使用模板引擎(如Mustach),而该引擎没有现成的集成,则需要在控制器中查找CSRF标记,并自己将其添加到模型中。@chrylis-你说得对;谢谢你的帮助。我在我的
@RequestMapping
处理程序方法中添加了一个
HttpServletRequest
参数,并从“\u csrf”属性中获得了一个
CsrfToken
的实例。如果您添加一个答案,我将接受它;model.addAttribute(“token”,token.getToken());
spring.mustache.expose-request-attributes=true