一、起因
使用了gateway
微服务作为整体的网关,并且整合了Spring Security6
;还有一个system微服务,作为被请求的资源,当浏览器向gateway
发送请求,请求system
资源时,遇到CORS
问题。
于是我在system
对应的controller
上加了@CrossOrigin
,无效;配置WebMvcConfigurer
,也无效。
后来发现,会不会是gateway
的spring security6
在一开始就拦截了CORS
跨域请求,导致根本走不到后面的system
配置。
查询了一波,果然如此。这里记录解决方法。
二、解决方法
这是依赖
language-xml1 2 3 4 5 6 7 8
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-resource-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
|
这是配置
language-java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| @EnableWebFluxSecurity @Configuration public class SecurityConfig {
//安全拦截配置 @Bean public SecurityWebFilterChain webFluxSecurityFilterChain(ServerHttpSecurity http) throws Exception { return http .cors(cors -> cors.configurationSource(corsConfigurationSource())) .authorizeExchange(exchanges -> exchanges .pathMatchers("/**").permitAll() .anyExchange().authenticated() ) .oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults())) .csrf(ServerHttpSecurity.CsrfSpec::disable) .build(); }
@Bean public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration corsConfig = new CorsConfiguration(); corsConfig.addAllowedOriginPattern("*"); // 允许任何源 corsConfig.addAllowedMethod("*"); // 允许任何HTTP方法 corsConfig.addAllowedHeader("*"); // 允许任何HTTP头 corsConfig.setAllowCredentials(true); // 允许证书(cookies) corsConfig.setMaxAge(3600L); // 预检请求的缓存时间(秒)
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", corsConfig); // 对所有路径应用这个配置 return source; } }
|
需要注意的是,在gateway
的spring security
中处理了CORS
问题后,后续的system
什么的,就不需要再二次处理了。因为CORS
是一个浏览器的策略,只要处理一次,告诉浏览器我允许跨域,浏览器收到后就不再阻拦请求了。