Обновление: теперь, оглядываясь назад, более чем через год, я даю надежду на обновление, которое поможет кому-то еще.
Spring IO рекомендует использовать защиту CSRF для любого запроса, который может быть обработан браузером обычными пользователями. Если вы создаете только службу, которая используется не браузерными клиентами, вы, вероятно, захотите отключить защиту CSRF. Поскольку мое приложение является API и будет обрабатываться браузером, отключение CSRF не является подходом.
CSRF включен с Spring Boot по умолчанию, вам нужно добавить следующий код, чтобы добавить репозиторий CSRF и фильтр для добавления токена CSRF в ваши запросы http. (Решение приходит отсюда Неверный CSRF-токен в POST-запросе)
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/assets/**", "/templates/**", "/custom-fonts/**", "/api/profile/**", "/h2/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.logoutSuccessUrl("/login?logout")
.permitAll()
.and()
.csrf().csrfTokenRepository(csrfTokenRepository())
.and()
.addFilterAfter(csrfHeaderFilter(), SessionManagementFilter.class); // Register csrf filter.
}
Часть фильтра и репозитория CsrfToken:
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 = WebUtils.getCookie(request, "XSRF-TOKEN");
String token = csrf.getToken();
if (cookie == null || token != null
&& !token.equals(cookie.getValue())) {
// Token is being added to the XSRF-TOKEN cookie.
cookie = new Cookie("XSRF-TOKEN", token);
cookie.setPath("/");
response.addCookie(cookie);
}
}
filterChain.doFilter(request, response);
}
};
}
private CsrfTokenRepository csrfTokenRepository() {
HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
repository.setHeaderName("X-XSRF-TOKEN");
return repository;
}
Оригинальный вопрос, который я задал в феврале 2016 года
Я работал над поддержкой Global CORS для Spring-boot RESTful API с Spring 4.
Я следую официальному документу Spring Boot Doc (https://spring.io/guides/gs/rest-service-cors/) и добавил его в свое приложение:
public class SomeApiApplication {
public static void main(String[] args) {
SpringApplication.run(SomeApiApplication.class, args);
}
//Enable Global CORS support for the application
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:8080")
.allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD")
.allowedHeaders("header1", "header2") //What is this for?
.allowCredentials(true);
}
};
}
}
Я не понимаю, почему работает только GET, для остальных вызовов http я получаю сообщение об ошибке "Недопустимый запрос CORS". Я что-то пропустил в настройке? Если мои настройки не верны, GET также не должен работать. Я очень смущен.