1. Обзор
В этой краткой статье мы разберёмся, как настроить CORS в Spring Security 6. Вкратце — мы обновим SecurityFilterChain, чтобы обеспечить такое решение, при котором наше приложение останется безопасным и работоспособным. Понимание того, как это сделать, поможет нам отказаться от устаревшего метода cors() в предыдущих версиях Spring Security Framework.
Давайте начнём.
2. Понимание CORS в Spring Security
Прежде чем сразу переходить к настройке, давайте сначала разберёмся, что такое CORS и как он управляется в Spring Security.
Cross-Origin Resource Sharing (CORS) is a security feature implemented in browsers to prevent malicious scripts from accessing resources from different domains. Поэтому нам нужно правильно настроить CORS в наших Spring applications и ограничить resource sharing между разными origins. Невыполнение этой настройки может привести к несанкционированному доступу к server resources со стороны web pages с других domains.
Начиная с Spring Security 6, метод cors() был объявлен deprecated и помечен для удаления в будущих релизах. Поэтому при работе с legacy applications нам нужно адаптировать наши security configurations, чтобы эффективно управлять CORS.
Давайте рассмотрим различные варианты, с помощью которых мы можем настроить конфигурацию CORS, чтобы наше приложение оставалось функциональным.
3. Отключение CORS в SecurityFilterChain
Самый простой способ справиться с CORS — полностью его отключить. Мы можем сделать это в конфигурационном bean SecurityFilterChain:
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.cors(AbstractHttpConfigurer::disable)
// MORE CODE
.build();
}
Отключение механизма безопасности, такого как CORS, может подвергнуть наше приложение уязвимостям. Поэтому важно понять последствия отключения CORS и убедиться, что наше приложение остаётся безопасным.
3. Настройка CORS в SecurityFilterChain
Если мы хотим защитить наше приложение с включённой поддержкой CORS, нам нужно настроить это в bean SecurityFilterChain. Для этого есть два шага. Сначала нам нужно создать конфигурацию для CORS. Затем нам нужно применить эту конфигурацию к нашему bean SecurityFilterChain.
3.1. Пользовательская конфигурация CORS
Для приложений, требующих специфических настроек CORS, мы можем определить собственный CorsConfigurationSource. Эта конфигурация укажет разрешённые origins, methods, headers и другие параметры, которые наше приложение будет учитывать:
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.setAllowedOrigins(List.of("http://localhost:1234"));
corsConfiguration.setAllowedMethods(List.of("GET", "POST"));
corsConfiguration.setAllowCredentials(true);
corsConfiguration.setAllowedHeaders(List.of("*"));
corsConfiguration.setMaxAge(3600L);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", corsConfiguration);
return source;
}
Вкратце, мы создали @Bean типа CorsConfigurationSource, зарегистрированный в UrlBasedCorsConfigurationSource, привязанной к пути /**. В этой конфигурации мы разрешаем запросы с http://localhost:1234, указываем allowed HTTP methods и задаём другие CORS parameters, такие как credentials, headers и max age.
Здесь эти параметры означают:
allowedOrigins: Список origins, которым разрешён доступ к ресурсам.allowedMethods: Список HTTP methods, которые разрешены.allowCredentials: Указывает, должен ли браузер включать credentials, такие как cookies, в запрос.allowedHeaders: Список headers, которые разрешены в запросе.maxAge: Максимальное время в секундах, в течение которого браузер должен кэшировать preflight response.
3.2. Настройка CorsConfigurationSource в SecurityFilterChain
Теперь нам нужно применить эту пользовательскую конфигурацию CORS к нашему SecurityFilterChain:
@Bean
public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
return http.csrf(AbstractHttpConfigurer::disable)
.cors(httpSecurityCorsConfigurer -> httpSecurityCorsConfigurer.configurationSource(corsConfigurationSource()))
.authorizeHttpRequests(requests -> requests
// MORE CODE
)
.build();
}
На этом мы завершаем настройку CORS в SecurityFilterChain. Мы успешно применили нашу собственную конфигурацию CORS, чтобы эффективно защитить наше приложение.
4. Заключение
В этой статье мы рассмотрели конфигурацию CORS. Сначала мы показали способ отключения CORS в SecurityFilterChain. Затем мы изучили, как создать пользовательскую конфигурацию CORS и применить её к SecurityFilterChain.
Мы можем найти полный code on Github

