CORS header 'Access-Control-Allow-Origin' 缺少 Spring 数据 REST

CORS header ‘Access-Control-Allow-Origin’ missing with Spring Data REST

我正在尝试解决 spring data rest 的 CORS 问题,但似乎没有附加 CORS headers。这是我的配置:

@Component
class DataRestConfig: RepositoryRestConfigurer {
    override fun configureRepositoryRestConfiguration(config: RepositoryRestConfiguration?, cors: CorsRegistry?) {
        cors?.addMapping("/*")
           ?.allowedOrigins("*")
           ?.allowedMethods("GET", "PUT", "DELETE","PATCH","POST","OPTIONS")
     }
}

我也遇到了与其他 API 路线相同的问题,这些路线超出了 spring 数据休息。这是我的 WebSecurityConfigurerAdapter

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
open class WebSecurityConfig(private val userDetailsServices: DatabaseUserDetailsServices, private val jwtService: JWTService): WebSecurityConfigurerAdapter() {

    @Value("${auth.jwt.secret}")
    private var secret: String = ""

    override fun configure(http: HttpSecurity) {
        http
            .cors().and()
            .csrf().disable()
            .addFilterAfter(JWTAuthorizationFilter(userDetailsServices, secret, jwtService),UsernamePasswordAuthenticationFilter::class.java)
            .authorizeRequests()
            .antMatchers(HttpMethod.POST,UserController.LOGIN_URL).permitAll()
            .antMatchers(HttpMethod.OPTIONS,"/**").permitAll()
            .anyRequest().authenticated()
    }
}

编辑:

  1. 添加了完整的 WebSecurityConfigurerAdapter
  2. 我注意到 OPTIONS 请求得到 403,这就是我为 OPTIONS 方法添加 antMatchers 但没有帮助的原因。
  3. 这是响应和请求 headers。没有回应 body:

您可以随时使用 CorsFilter 来修改响应 headers。在这里,我已经回答了如何在 Spring 引导中自定义 CorsFilter - https://whosebug.com/a/66882700/3709922。请看一下。

如果使用 Spring MVC,您应该像这样配置 CORS 行为

@Configuration
public class CorsConfiguration implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
            .allowedOrigins("http://localhost:3000")
            .allowedMethods("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS");
    }
}

我不知道为什么不考虑其他配置,我不知道这是否被认为是一个好的解决方案,但由于我只在本地环境中需要它,所以它并不那么重要。这就是我的工作方式:

@Bean
@Profile("local")
open fun corsConfigurationSource(): CorsConfigurationSource{
    val cors = UrlBasedCorsConfigurationSource()
    val config = CorsConfiguration().applyPermitDefaultValues()

    config.addAllowedMethod(HttpMethod.OPTIONS)
    config.addAllowedMethod(HttpMethod.POST)
    config.addAllowedMethod(HttpMethod.PATCH)
    config.addAllowedMethod(HttpMethod.DELETE)

    cors.registerCorsConfiguration("/**", config)

    return cors
}