Spring Security 6中CORS配置指南

CORS(跨源资源共享)是一种由Web浏览器实现的安全特性,用于防止网站未经授权地向不同域发起请求。CORS通过HTTP头部来指定哪些来源被允许访问Web服务器上的资源。

CORS对于保护Web应用程序至关重要,因为它通过控制跨域请求来维护安全性。如果CORS配置不当,应用程序可能会面临跨站请求伪造(CSRF)和跨站脚本攻击(XSS)等安全威胁。正确配置CORS有助于确保只有受信任的域可以访问资源。

在Spring Security 6中配置CORS

Spring Security 6提供了一种现代的方法来配置CORS,使用SecurityFilterChain和CorsConfigurationSource接口。这种设置提供了一种清晰且灵活的方式来管理CORS策略。

下面是一个使用Spring Security 6在Spring Boot应用程序中配置CORS的基本示例: import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.web.SecurityFilterChain; import org.springframework.web.servlet.config.annotation.CorsConfiguration; import org.springframework.web.servlet.config.annotation.CorsConfigurationSource; import org.springframework.web.servlet.config.annotation.UrlBasedCorsConfigurationSource; import java.util.Arrays; @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.cors(c -> c.configurationSource(corsConfigurationSource())) .csrf().disable() .authorizeRequests(authorizeRequests -> authorizeRequests.anyRequest().authenticated() ); return http.build(); } @Bean public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration configuration = new CorsConfiguration(); configuration.setAllowedOrigins(Arrays.asList("http://example.com")); configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE")); configuration.setAllowedHeaders(Arrays.asList("*")); configuration.setAllowCredentials(true); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", configuration); return source; } }

在这个示例中:

  • 配置CORS以允许来自http://example.com的请求。
  • 指定了允许的HTTP方法和头部。
  • 启用了凭据,以允许cookies和认证头部。

对于更复杂的需求,例如允许特定的头部并暴露额外的头部,可以增强CORS配置: import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.web.SecurityFilterChain; import org.springframework.web.servlet.config.annotation.CorsConfiguration; import org.springframework.web.servlet.config.annotation.CorsConfigurationSource; import org.springframework.web.servlet.config.annotation.UrlBasedCorsConfigurationSource; import java.util.Arrays; @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.cors(c -> c.configurationSource(corsConfigurationSource())) .csrf().disable() .authorizeRequests(authorizeRequests -> authorizeRequests.anyRequest().authenticated() ); return http.build(); } @Bean public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration configuration = new CorsConfiguration(); configuration.setAllowedOrigins(Arrays.asList("http://example.com")); configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE")); configuration.setAllowedHeaders(Arrays.asList("*")); configuration.setAllowCredentials(true); configuration.setExposedHeaders(Arrays.asList("Authorization", "Content-Type")); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", configuration); return source; } }

在高级配置中:

  • 添加了暴露头部,允许在响应中看到Authorization和Content-Type头部。
  • 这种设置对于需要处理自定义头部或令牌的应用程序非常有用。

测试CORS配置

一旦设置了CORS,测试它是否按预期工作至关重要。以下是可以进行测试的方法:

打开Postman并创建一个新的请求。 将请求方法设置为GET并输入API端点。 在Headers标签下,添加一个新的头部Origin,值为http://example.com。 发送请求并检查响应头部中是否有Access-Control-Allow-Origin头部。

示例结果: 应该看到类似这样的响应头部: Access-Control-Allow-Origin: http://example.com

在浏览器中打开Web应用程序。 打开浏览器的开发者工具(F12或右键单击并选择“检查”)。 转到Network标签并请求API。 检查响应头部以确保Access-Control-Allow-Origin存在且设置正确。

示例结果: 在Network标签下的Headers部分,应该看到: Access-Control-Allow-Origin: http://example.com

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485