一尘不染

如何配置Spring Security发送“ X-CSRF-TOKEN”?

spring-boot

问题是要使CSRF令牌在Spring Security和Angular之间工作。

Angular的Spring Security CSRF令牌拦截器似乎应该可以完成任务,但是服务器的HEAD响应中没有“ X-CSRF-TOKEN”。

我当前的微小实现可在GitHub(Tag
v.1.0)上获得,如果知道该主题的人对代码有快速了解,我将不胜感激,这个问题应该很容易发现。

根据文档,我的印象是应该自动启用CSRF,但事实并非如此。

我正在使用Spring Boot,如果需要以其他方式配置某些内容,则我希望使用基于注释的配置,而不是XML。

还有其他方法可以使Spring Security对抗Angular吗?


阅读 971

收藏
2020-05-30

共1个答案

一尘不染

我相信Angular会寻找一个名为“ XSRF-
TOKEN”的cookie,因此对客户端来说,最简单的方法就是发送该cookie。您可以在一个Filter例子中做到这一点(例如来自https://github.com/spring-
guides/tut-spring-security-and-angular-
js/blob/master/single/src/main/java/demo/UiApplication的示例.java#L65):

    private Filter csrfHeaderFilter() {
        return new OncePerRequestFilter() {
            @Override
            protected void doFilterInternal(HttpServletRequest request,
                    HttpServletResponse response, FilterChain filterChain)
                    throws ServletException, IOException {
                CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class
                        .getName());
                if (csrf != null) {
                    Cookie cookie = new Cookie("XSRF-TOKEN", csrf.getToken());
                    cookie.setPath("/");
                    response.addCookie(cookie);
                }
                filterChain.doFilter(request, response);
            }
        };
    }

更新:从spring security 4.2开始,如果您使用cookie
csrf存储库,则默认使用angular的正确cookie名称(链接仍然是最佳来源),即不再需要自定义过滤器。例:

@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
protected static class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                ...
                .and()
            .csrf()
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
2020-05-30