我試圖將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,但角度不會將此標記的標題添加到請求中。現在我試圖找出爲什麼以及如何解決這個問題。 –