CSRF令牌和多个服务器

时间:2016-07-10 12:19:53

标签: angularjs spring spring-security load-balancing csrf-protection

我在AngularJs和Spring Application中使用CSRF令牌实现了Spring Security。以下是启用CSRF令牌过滤器的代码。

@Override
protected void configure(HttpSecurity http) throws Exception {
             http
            .authorizeRequests()
            .antMatchers("/apps", "/sites", "/users").authenticated()
            .and()
            .csrf()
            .csrfTokenRepository(csrfTokenRepository())
            .and()
            .addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class);
}
private CsrfTokenRepository csrfTokenRepository() {
            HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
            repository.setHeaderName("X-XSRF-TOKEN");
            return repository;
}

public class CsrfHeaderFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    CsrfToken token = (CsrfToken) request.getAttribute(CsrfToken.class
            .getName());
    if (token != null) {
        Cookie cookie = WebUtils.getCookie(request, "X-XSRF-TOKEN");
        if (cookie == null || token != null && !token.equals(cookie.getValue())) {
            cookie = new Cookie("X-XSRF-TOKEN", token.getToken());
            cookie.setPath("/");
            response.addCookie(cookie);
        }
    }
    filterChain.doFilter(request, response);
}

使用上面的代码,我的应用程序在本地Tomcat服务器(Spring Boot Server)和Wildfly服务器中运行良好。但是当我尝试在使用多个IP地址的Development Server中部署相同的代码时,我收到无效的CSRF令牌错误。

以下是截图 enter image description here 从此屏幕截图中,请求和响应中JSESSIONID中的IP地址不同。请为此问题提出解决方案。
更新
停止负载均衡服务器(目前只有一台服务器正在运行)后,我没有遇到CSRF问题。请为负载均衡服务器问题建议解决方案。
更新
经过分析,我们才知道,我们可以使用Sticky Session来解决这个问题。但根据我们的客户要求,我们不能使用Sticky Session。

0 个答案:

没有答案