spring 5 webflux功能终结点请求中不存在访问控制源标头

spring 5 webflux功能终结点请求中不存在访问控制源标头,spring,angular,vue.js,spring-security,cors,Spring,Angular,Vue.js,Spring Security,Cors,我查阅了大量资源,试图找到解决问题的正确方法。从我的角度来看,我认为我已经准备好了我需要的一切,但我无法找出问题所在 我正在使用Spring5和WebFlux以及功能端点 当我从vuejs前端发送GET请求时,我得到以下信息: 加载失败http://localhost:8080/test: 请求的资源上不存在“Access Control Allow Origin”标头。起源'http://localhost:8081因此,不允许访问。响应的HTTP状态代码为401。 请求如下: 选项/测试H

我查阅了大量资源,试图找到解决问题的正确方法。从我的角度来看,我认为我已经准备好了我需要的一切,但我无法找出问题所在

我正在使用Spring5WebFlux以及功能端点

当我从vuejs前端发送GET请求时,我得到以下信息:

加载失败http://localhost:8080/test: 请求的资源上不存在“Access Control Allow Origin”标头。起源'http://localhost:8081因此,不允许访问。响应的HTTP状态代码为401。

请求如下:


选项/测试HTTP/1.1
主机:本地主机:8080
连接:保持活力
Pragma:没有缓存
缓存控制:没有缓存
访问控制请求方法:GET
来源:http://localhost:8081
用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/69.0.3497.100 Safari/537.36
访问控制请求头:授权
接受:*/*
接受编码:gzip,deflate,br
接受语言:en-US,en;q=0.9,ro;q=0.8

我的春季安全配置

  @Bean
  public SecurityWebFilterChain securityWebFilterChain(
      ServerHttpSecurity http) {
    return http
        .authorizeExchange()
        .pathMatchers("/users/authenticate").permitAll()
        .anyExchange()
        .authenticated()
        .and()
        .httpBasic()
        .and()
        .build();
  }
我尝试了几种不同的方法,这是最后两种:

一,


为什么不工作?

问题似乎不是cors配置的问题

与此同时,我采用了一些不同的方法

  @Bean
  public SecurityWebFilterChain securityWebFilterChain(
      ServerHttpSecurity http) {
    return http
        .authorizeExchange()
        .pathMatchers(HttpMethod.OPTIONS).permitAll()
        .anyExchange()
        .authenticated()
        .and()
        .httpBasic()
        .and()
        .build();
  }
问题出在spring安全配置中。我只允许对
/users/authenticate
的所有请求,而不允许所有
选项
方法

我当前的cors配置为:

  @Bean
  CorsWebFilter corsFilter() {

    CorsConfiguration config = new CorsConfiguration();

    config.setAllowCredentials(true);
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    config.addAllowedMethod("*");

    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", config);

    return new CorsWebFilter(source);
  }

看起来问题实际上不是cors配置

与此同时,我采用了一些不同的方法

  @Bean
  public SecurityWebFilterChain securityWebFilterChain(
      ServerHttpSecurity http) {
    return http
        .authorizeExchange()
        .pathMatchers(HttpMethod.OPTIONS).permitAll()
        .anyExchange()
        .authenticated()
        .and()
        .httpBasic()
        .and()
        .build();
  }
问题出在spring安全配置中。我只允许对
/users/authenticate
的所有请求,而不允许所有
选项
方法

我当前的cors配置为:

  @Bean
  CorsWebFilter corsFilter() {

    CorsConfiguration config = new CorsConfiguration();

    config.setAllowCredentials(true);
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    config.addAllowedMethod("*");

    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", config);

    return new CorsWebFilter(source);
  }

服务器似乎需要对选项请求进行身份验证。需要将其修复为不需要对选项请求进行身份验证,因为无论前端JavaScript代码发送什么请求,都会导致浏览器首先发出CORS飞行前选项请求,并且浏览器从不包含身份验证凭据(例如,授权请求标头)在CORS飞行前选项请求中。@sideshowbarker正如您所见,我已经将选项方法添加到CORS配置中了是的,仅仅将选项方法添加到CORS配置是不够的。如果是的话,服务器将不会用401响应。CORS配置之外的一些其他更改也是必要的。例如,请参阅服务器上的答案似乎要求对选项请求进行身份验证。需要将其修复为不需要对选项请求进行身份验证,因为无论前端JavaScript代码发送什么请求,都会导致浏览器首先发出CORS飞行前选项请求,并且浏览器从不包含身份验证凭据(例如,授权请求标头)在CORS飞行前选项请求中。@sideshowbarker正如您所见,我已经将选项方法添加到CORS配置中了是的,仅仅将选项方法添加到CORS配置是不够的。如果是的话,服务器将不会用401响应。CORS配置之外的一些其他更改也是必要的。例如,请参见第页的答案