CORS

Spring Framework 提供了 对 CORS 的一流支持。CORS 必须在 Spring Security 之前处理,因为预检请求不包含任何 cookie(即 JSESSIONID)。如果请求不包含任何 cookie,并且 Spring Security 首先处理,则请求会判定用户未经身份验证(因为请求中没有 cookie)并拒绝该请求。

确保 CORS 首先被处理的最简单方法是使用 CorsFilter。用户可以通过提供一个 CorsConfigurationSourceCorsFilter 集成到 Spring Security 中。请注意,只有当存在 UrlBasedCorsConfigurationSource 实例时,Spring Security 才会自动配置 CORS。例如,以下代码将 CORS 支持集成到 Spring Security 中:

  • Java

  • Kotlin

@Bean
UrlBasedCorsConfigurationSource corsConfigurationSource() {
    CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowedOrigins(Arrays.asList("https://example.com"));
    configuration.setAllowedMethods(Arrays.asList("GET","POST"));
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
}
@Bean
fun corsConfigurationSource(): UrlBasedCorsConfigurationSource {
    val configuration = CorsConfiguration()
    configuration.allowedOrigins = listOf("https://example.com")
    configuration.allowedMethods = listOf("GET", "POST")
    val source = UrlBasedCorsConfigurationSource()
    source.registerCorsConfiguration("/**", configuration)
    return source
}

以下清单在 XML 中执行相同操作:

<http>
	<cors configuration-source-ref="corsSource"/>
	...
</http>
<b:bean id="corsSource" class="org.springframework.web.cors.UrlBasedCorsConfigurationSource">
	...
</b:bean>

如果您使用 Spring MVC 的 CORS 支持,您可以省略指定 CorsConfigurationSource,Spring Security 将使用提供给 Spring MVC 的 CORS 配置。

  • Java

  • Kotlin

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

	@Bean
	public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
		http
			// if Spring MVC is on classpath and no CorsConfigurationSource is provided,
			// Spring Security will use CORS configuration provided to Spring MVC
			.cors(withDefaults())
			...
		return http.build();
	}
}
@Configuration
@EnableWebSecurity
open class WebSecurityConfig {
    @Bean
    open fun filterChain(http: HttpSecurity): SecurityFilterChain {
        http {
            // if Spring MVC is on classpath and no CorsConfigurationSource is provided,
            // Spring Security will use CORS configuration provided to Spring MVC
            cors { }
            // ...
        }
        return http.build()
    }
}

以下清单在 XML 中执行相同操作:

<http>
	<!-- Default to Spring MVC's CORS configuration -->
	<cors />
	...
</http>

如果您有多个 CorsConfigurationSource bean,Spring Security 不会自动为您配置 CORS 支持,因为它无法决定使用哪一个。如果您想为每个 SecurityFilterChain 指定不同的 CorsConfigurationSource,您可以将其直接传递给 .cors() DSL。

  • Java

  • Kotlin

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

	@Bean
	@Order(0)
	public SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception {
		http
			.securityMatcher("/api/**")
			.cors((cors) -> cors
				.configurationSource(apiConfigurationSource())
			)
			...
		return http.build();
	}

	@Bean
	@Order(1)
	public SecurityFilterChain myOtherFilterChain(HttpSecurity http) throws Exception {
		http
			.cors((cors) -> cors
				.configurationSource(myWebsiteConfigurationSource())
			)
			...
		return http.build();
	}

	UrlBasedCorsConfigurationSource apiConfigurationSource() {
		CorsConfiguration configuration = new CorsConfiguration();
		configuration.setAllowedOrigins(Arrays.asList("https://api.example.com"));
		configuration.setAllowedMethods(Arrays.asList("GET","POST"));
		UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
		source.registerCorsConfiguration("/**", configuration);
		return source;
	}

	UrlBasedCorsConfigurationSource myWebsiteConfigurationSource() {
		CorsConfiguration configuration = new CorsConfiguration();
		configuration.setAllowedOrigins(Arrays.asList("https://example.com"));
		configuration.setAllowedMethods(Arrays.asList("GET","POST"));
		UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
		source.registerCorsConfiguration("/**", configuration);
		return source;
	}

}
@Bean
fun corsConfigurationSource(): UrlBasedCorsConfigurationSource {
    val configuration = CorsConfiguration()
    configuration.allowedOrigins = listOf("https://example.com")
    configuration.allowedMethods = listOf("GET", "POST")
    val source = UrlBasedCorsConfigurationSource()
    source.registerCorsConfiguration("/**", configuration)
    return source
}

CORS 是一种基于浏览器的安全功能。通过使用 .cors(CorsConfigurer::disable) 在 Spring Security 中禁用 CORS,您并非从浏览器中移除了 CORS 保护。相反,您从 Spring Security 中移除了 CORS 支持,用户将无法从跨源浏览器应用程序与您的 Spring 后端进行交互。要修复应用程序中的 CORS 错误,您必须启用 CORS 支持,并提供适当的配置源。

© . This site is unofficial and not affiliated with VMware.