如何使用带胡子的Spring Security?

kiayqfof  于 2023-01-30  发布在  Spring
关注(0)|答案(3)|浏览(164)

我参考了Spring Security的参考资料,我已经获得了一个自定义登录页面的重定向,如3.3节所述。但是,我不确定如何在Mustache中获得CSRF令牌(所有示例都使用JSP)。

{{#_csrf}}
    <input type="hidden" name="{{parameterName}}" value="{{token}}"/>
{{/_csrf}}

...还有这个...

{{#CsrfToken}}
    <input type="hidden" name="{{parameterName}}" value="{{token}}"/>
{{/CsrfToken}}

...但是它们不起作用(我真的不希望它们起作用)。我如何才能在Mustache中获得CSRF令牌?
我也在想:我可以在代码中的什么地方设置断点,以查看Spring Security将什么作为模型发送到我的自定义登录视图?)

lhcgjxsq

lhcgjxsq1#

将此添加到您的application.properties

spring.mustache.expose-request-attributes=true

然后,您可以访问模板中的_csrf请求属性。

ou6hu8tu

ou6hu8tu2#

我不确定这是哪个版本提供的,但是您可以在控制器方法上为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);
        }
    }
}

豆子:

@Configuration
public class Config {
    @Bean
    public CsrfTokenInterceptor csrfTokenInterceptor() {
        return new CsrfTokenInterceptor();
    }
}

在WebMvcConfigurer中添加拦截器:

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

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

jjhzyzn03#

将其添加到您的application.properties:

spring.mustache.servlet.expose-request-attributes=true

然后,您可以访问模板中的_csrf请求属性。
在Sping Boot 2.7.0版中,属性已从spring.mustache.expose-request-attributes重命名。
版本:https://github.com/spring-projects/spring-boot/issues/28858

相关问题