Мне удалось это исправить, следуя официальной документации по ссылке ниже. Суть в том, что CORS должен быть обработан до пружинной безопасности.
https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#cors
Вот мой окончательный код:
@EnableWebFluxSecurity
@EnableReactiveMethodSecurity
class AppSecurity(val authManager: AuthenticationManager,
val securityContextRepository: SecurityContextRepository) {
@Bean
fun securityWebFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain {
return http.cors(Customizer.withDefaults()).csrf().disable()
.formLogin().disable()
.httpBasic().disable()
.authenticationManager(authManager)
.securityContextRepository(securityContextRepository)
.authorizeExchange()
.pathMatchers(HttpMethod.OPTIONS, "/**").permitAll()
.pathMatchers(HttpMethod.POST, "/apiv1/user", "/apiv1/user/login").permitAll()
.pathMatchers(HttpMethod.GET, "/apiv1/user", "/apiv1/user/**").permitAll()
.pathMatchers(HttpMethod.POST, "/apiv1/shopping/**").hasAnyRole("ROLE_CLIENT", "ROLE_ADMIN")
.pathMatchers(HttpMethod.GET, "/apiv1/shopping/**").hasAnyRole("ROLE_CLIENT", "ROLE_ADMIN")
.anyExchange().authenticated()
.and().build()
}
@Bean
fun corsConfigurationSource(): CorsConfigurationSource {
val configuration = CorsConfiguration()
configuration.allowCredentials = true
configuration.allowedOrigins = mutableListOf("*")
configuration.allowedMethods = mutableListOf("*")
configuration.allowedHeaders = mutableListOf("*")
val source = UrlBasedCorsConfigurationSource()
source.registerCorsConfiguration("/**", configuration)
return source
}
}