Требование заключается в том, что в каждом запросе значение XSRF-TOKEN должно проверяться с тем, которое хранится на сервере.Вот конфигурация безопасности:
protected void configure(HttpSecurity http) throws Exception {
http
.formLogin()
.loginProcessingUrl("/authenticate")
.usernameParameter(...)
.passwordParameter(...)
.loginPage("/").permitAll()
.successHandler(authenticationSuccessHandler)
.failureHandler(authenticationFailureHandler)
.and().logout().permitAll().logoutSuccessHandler(logoutSuccessHandler)
.and().authorizeRequests()
.antMatchers(...).permitAll().anyRequest().authenticated()
.and().csrf().csrfTokenRepository(csrfTokenRepository())
.and().addFilterAfter(csrfHeaderFilter(), CsrfFilter.class)
.exceptionHandling (). AuthenticationEntryPoint (authenticationEntryPoint);
Как я думал, это будет работать, внутри csrfHeaderFilter()
я могу получить заголовок от каждогозапросите с помощью request.getHeader("X-XSRF-TOKEN")
, а затем просто сравните этот токен с тем, который находится на сервере, который получен следующим образом: request.getSession(false).getAttribute("...CSRF_TOKEN").getToken()
Если они не совпадают - выведите ошибку.Но иногда request.getHeader("X-XSRF-TOKEN")
возвращает ноль даже после того, как пользователь вошел в систему. Почему это происходит и как узнать, какие запросы требуют проверки?И самое главное, можно ли сделать такую проверку?