问题是要使CSRF令牌在Spring Security和Angular之间工作。
Angular的Spring Security CSRF令牌拦截器似乎应该可以完成任务,但是服务器的HEAD响应中没有“ X-CSRF-TOKEN”。
我当前的微小实现可在GitHub(Tag v.1.0)上获得,如果知道该主题的人对代码有快速了解,我将不胜感激,这个问题应该很容易发现。
v.1.0
根据文档,我的印象是应该自动启用CSRF,但事实并非如此。
我正在使用Spring Boot,如果需要以其他方式配置某些内容,则我希望使用基于注释的配置,而不是XML。
还有其他方法可以使Spring Security对抗Angular吗?
我相信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):
Filter
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());