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 上查看完整代码。