如何配置Spring Security以发送'X-CSRF-TOKEN'?

mas*_*asa 11 spring csrf spring-security angularjs 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的任何其他方法?

Dav*_*yer 10

Angular寻找一个名为"XSRF-TOKEN"的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);
            }
        };
    }
Run Code Online (Sandbox Code Playgroud)

更新:自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());
Run Code Online (Sandbox Code Playgroud)