问题是让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的任何其他方法吗?
答案 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)