跳过正文

在 Spring Security 6 中配置 CORS

Spring-Security Cors Security-Filter-Chain Web
翻译者
Namastecode
目录

1. 概述

在这篇简短的文章中,我们将学习如何在 Spring Security 6 中配置 CORS。简而言之,我们会更新 SecurityFilterChain,以便提供一个解决方案,使我们的应用程序保持安全和功能正常。理解如何做到这一点将帮助我们摆脱 Spring Security 框架早期版本中已弃用的 cors() 方法。

让我们开始吧。

2. 理解 Spring Security 中的 CORS

在直接进入配置之前,让我们先了解一下什么是 CORS 以及它在 Spring Security 中是如何管理的。

跨域资源共享 (CORS) 是浏览器中实现的一项安全功能,用于防止恶意脚本访问来自不同域的资源。因此,我们需要在 Spring 应用程序中正确配置 CORS,并限制跨不同来源的资源共享。如果不这样做,可能会导致来自不同域的网页未经授权访问服务器资源。

从 Spring Security 6 开始,cors() 方法已被弃用,并计划在未来版本中移除。因此,在处理遗留应用程序时,我们必须调整我们的安全配置,以有效管理 CORS。

让我们一起看看多种处理CORS配置的方法,以保持我们的应用程序正常运行。

3. 在 SecurityFilterChain 中禁用 CORS

处理 CORS 的最简单方法是完全禁用它。我们可以在 SecurityFilterChain 配置 bean 中实现:

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    return http
            .cors(AbstractHttpConfigurer::disable)
            // MORE CODE
            .build();
}

禁用像CORS这样的安全功能可能会使我们的应用程序暴露于漏洞中。因此,了解禁用CORS的影响并确保我们的应用程序保持安全是至关重要的。

3. 在 SecurityFilterChain 中配置 CORS

如果我们想在启用CORS的情况下保护我们的应用程序,我们必须在SecurityFilterChain bean中配置它。这个过程分为两个步骤。首先,我们需要为我们的CORS创建一个配置。其次,我们需要将这个配置应用到我们的SecurityFilterChain中。

3.1. 自定义 CORS 配置

对于需要特定 CORS 设置的应用程序,我们可以定义一个自定义的 CorsConfigurationSource。此配置将指定允许的来源、方法、头信息以及我们的应用程序将会理解的其他参数:

@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;
}

简而言之,我们创建了一个类型为 CorsConfigurationSource 的 @Bean,并将其注册到一个与 /** 路径关联的 UrlBasedCorsConfigurationSource。在此配置中,我们允许来自 http://localhost:1234 的请求,指定允许的 HTTP 方法,并设置其他 CORS 参数,如凭证、头信息和最大存活时间。

这里这些参数表示:

  • allowedOrigins:允许访问资源的来源列表。
  • allowedMethods:允许的HTTP方法列表。
  • allowCredentials:浏览器是否应在请求中包含诸如cookies之类的凭据。
  • allowedHeaders:请求中允许的头列表。
  • maxAge:浏览器应缓存预检响应的最长时间(以秒为单位)。

3.2. 在 SecurityFilterChain 中设置 CorsConfigurationSource

现在,我们需要将这个自定义的 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();
}

这就完成了我们在 SecurityFilterChain 中的 CORS 配置。我们已经成功应用了自定义的 CORS 配置来有效地保护我们的应用程序。

4. 总结

在这篇文章中,我们学习了关于 CORS 配置的内容。首先,我们提供了一种在 SecurityFilterChain 中禁用 CORS 的方法。然后,我们探讨了如何创建一个自定义的 CORS 配置并将其应用到 SecurityFilterChain 中。

我们可以在 Github 上查看完整代码

相关文章

理解 Spring 的 @Scheduled Cron 语法
Spring Cron Scheduling
配置多个数据源在 Spring Boot 中
Spring Database
在 Spring Boot 集成测试中使用 Testcontainers
Spring Testcontainers Testing