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

时间:2014-12-13 09:36:50

标签: angularjs spring spring-security spring-boot csrf

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

Spring Security CSRF Token Interceptor for Angular似乎应该可以胜任这项工作,但是没有“X-CSRF-TOKEN'在来自服务器的HEAD响应中。

我目前很小的实现可以在GitHub(标记v.1.0)中找到,如果知道该主题的人会快速查看代码,我会非常感激,问题应该很容易点。

根据文档,我认为CSRF应该已经自动启用,但似乎并非如此。

我正在使用Spring Boot并且更喜欢基于注释的配置而不是XML,如果需要以不同的方式配置它。

使Spring Security能够对抗Angular的任何其他方法吗?

2 个答案:

答案 0 :(得分:8)

Angular寻找名为" XSRF-TOKEN"我相信,所以为客户做最简单的事就是发送它。例如,您可以在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());

答案 1 :(得分:1)

我自己回答这个问题,因为原来的GitHub存储库中有一个隐藏的文件:Issue #1

解决方案是添加几行Java代码,将CSRF参数添加为Http消息头。

我使用标记v.2.0向GitHub添加了一个有效的解决方案repo