Java 如何使用带胡子的弹簧安全?
我遵循Spring安全性参考,并重定向到一个自定义登录页面,如中所述。但是,我不确定如何在Mustache中获取CSRF令牌(所有示例都使用JSP)。我试过一些像这样天真的事情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
{{#_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 MVCDispatcherServlet
。如果要使用模板引擎(如Mustach),而该引擎没有现成的集成,则需要在控制器中查找CSRF标记,并自己将其添加到模型中。@chrylis-你说得对;谢谢你的帮助。我在我的@RequestMapping
处理程序方法中添加了一个HttpServletRequest
参数,并从“\u csrf”属性中获得了一个CsrfToken
的实例。如果您添加一个答案,我将接受它;model.addAttribute(“token”,token.getToken());
spring.mustache.expose-request-attributes=true