Перейти к основному содержимому

Настройка CORS в Spring Security 6

Profile picture
Автор
Namastecode
Profile picture
Автор
Namastecode
Оглавление

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

Related

Как выполнять повторные попытки с помощью Restclient
Давайте узнаем, как реализовать retryable calls с помощью RestClient при поддержке spring-retry. Систематически обрабатываем временные сбои при выполнении HTTP-запросов.
Понимание синтаксиса Cron для @Scheduled в Spring
Давайте узнаем, как использовать аннотацию @Scheduled в Spring с cron expressions.
Настройка нескольких Data Sources в Spring Boot
Мы научимся настраивать несколько data sources в приложении Spring Boot, что позволит использовать отдельные databases и назначать конкретные data sources для Spring Data JPA repositories.