我试图将CSRF/XSRF保护添加到我的应用程序,但遇到了奇怪的行为。所有获取请求都可以正常工作,但是在所有的post/put/delete中,我得到了403未授权。最奇怪的是,当我试图调试我的CSRF过滤器时,请求没有达到它,它们在之前的某个地方被拒绝。他们甚至没有达到我的认证过滤器,所以我无法弄清楚问题可能是什么。Spring Security和AngularJS的CSRF/XSRF保护
我的安全配置:
@Override
public void configure(HttpSecurity http) throws Exception {
http
...
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.addFilterBefore(new StatelessAuthenticationFilter(tokenAuthenticationService()), UsernamePasswordAuthenticationFilter.class)
.addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class)
.csrf().csrfTokenRepository(csrfTokenRepository());
}
private CsrfTokenRepository csrfTokenRepository() {
HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
repository.setHeaderName("X-XSRF-TOKEN");
return repository;
}
我不加过滤器,因为正如我所说,这些请求没有达到他们。但如果需要,我会完成我的问题。希望对你有所帮助,提前谢谢!
为此我实现我的自定义CSRF过滤器,但我问题是,请求甚至没有达到它,这很奇怪 –
@AnarSultanov,你可以请你分享你的过滤代码吗?虽然,没关系,因为你在* Spring的'CsrfFilter'之后添加了过滤器*。如果Springs过滤器不能匹配来自用户会话的令牌(它不能得到,因为没有会话)调用'accessDeniedHandler'并做'return'(打破过滤器链),这意味着它不会调用'filterChain.doFilter(request,response);',所以你的过滤器实际上不能被调用。如果你正在实现你自己的CSRF保护 - 那么,我想你应该通过调用'.csrf()。disable()'来禁用Spring的实现。 – Leffchik
我发现可能是我的问题。我在Cookie中有XSRF-TOKEN,但角度不会将此标记的标题添加到请求中。现在我试图找出为什么以及如何解决这个问题。 –