当 Origin 被定义为 webapp 自己的主机名以外的任何内容时,Spring boot 2.2.4.RELEASE 为 GET 请求返回 403

Posted

技术标签:

【中文标题】当 Origin 被定义为 webapp 自己的主机名以外的任何内容时,Spring boot 2.2.4.RELEASE 为 GET 请求返回 403【英文标题】:Spring boot 2.2.4.RELEASE returning 403 for GET request when Origin is defined as anything other than the webapp's own hostname 【发布时间】:2020-10-02 09:30:53 【问题描述】:

大家早上好, 在我的 Spring Boot 应用程序(我们将其部署为战争)的端点子集上启用 CORS 时,预检工作完美,但是当发出实际 GET 请求时,webapp 返回一个 403,没有记录表明它被禁止的原因(即使在 logback.xml 中启用了跟踪日志记录),以下是给定请求的最后一组日志。

[https-jsse-nio-9643-exec-3] o.s.s.w.a.i.FilterSecurityInterceptor    : Authorization successful
[https-jsse-nio-9643-exec-3] o.s.s.w.a.i.FilterSecurityInterceptor    : RunAsManager did not change Authentication object
[https-jsse-nio-9643-exec-3] o.s.security.web.FilterChainProxy        : /path/myendpoint reached end of additional filter chain; proceeding with original chain
[https-jsse-nio-9643-exec-3] o.s.w.f.CommonsRequestLoggingFilter      : Before request [GET /path/myendpoint]
[https-jsse-nio-9643-exec-3] o.s.w.f.CommonsRequestLoggingFilter      : After request [GET /path/myendpoint]
[https-jsse-nio-9643-exec-3] o.s.s.w.a.ExceptionTranslationFilter     : Chain processed normally
[https-jsse-nio-9643-exec-3] s.s.w.c.SecurityContextPersistenceFilter : SecurityContextHolder now cleared, as request processing completed
[https-jsse-nio-9643-exec-3] o.s.b.w.s.f.OrderedRequestContextFilter  : Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@1b766a09

唯一的例外是当我从请求中省略 Origin Header 或将其设置为与 Spring 引导主机完全相同的值时,在这种情况下请求成功完成。

这是我的 WebSecurityConfigurerAdapter 配置


@Bean
CorsConfigurationSource corsConfigurationSource() 
    CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowedOrigins(Collections.singletonList("*"));
    configuration.setAllowedMethods(Arrays.asList("GET", "POST", "OPTIONS", "DELETE", "PUT", "PATCH"));
    configuration.setAllowedHeaders(Arrays.asList("X-Requested-With", "Origin", "Content-Type", "Accept", "Authorization"));
    configuration.setAllowCredentials(true);
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/path/**", configuration);
    return source;


@Override
protected void configure(HttpSecurity http) throws Exception 
    http.cors(withDefaults())
    .authorizeRequests()
            .mvcMatchers("/**").authenticated()
            .and()
            .exceptionHandling().accessDeniedHandler(datamartSecurityErrorHandler)
            .and()
            .oauth2ResourceServer().jwt().and().authenticationEntryPoint(datamartSecurityErrorHandler)
    .and().csrf(AbstractHttpConfigurer::disable);


@Bean
JwtDecoder jwtDecoder() 
    NimbusJwtDecoder jwtDecoder = (NimbusJwtDecoder) JwtDecoders.fromOidcIssuerLocation(issuer);

    OAuth2TokenValidator<Jwt> audienceValidator = new DatamartAudienceValidator(audience);
    OAuth2TokenValidator<Jwt> issuerValidator = JwtValidators.createDefaultWithIssuer(issuer);
    OAuth2TokenValidator<Jwt> validator = new DelegatingOAuth2TokenValidator<>(issuerValidator, audienceValidator);

    jwtDecoder.setJwtValidator(validator);

    return jwtDecoder;


对 /path/** 模式之外的端点发出的任何请求仍然可以正常工作(没有 CORS 标头)。

有没有其他人遇到过这种情况或对如何进一步排除故障有任何建议。 谢谢,如果我能提供任何其他帮助回答,请告诉我。

【问题讨论】:

【参考方案1】:

事实证明,在我们的 tomcat 服务器的 conf 文件夹中隐藏的 web.xml 文件中定义了一个 CORS 过滤器。删除过滤器并让 Spring 在应用程序中处理 cors 解决了这个问题。

【讨论】:

以上是关于当 Origin 被定义为 webapp 自己的主机名以外的任何内容时,Spring boot 2.2.4.RELEASE 为 GET 请求返回 403的主要内容,如果未能解决你的问题,请参考以下文章

自定义百度地图导航控件

Makefile: 函数origin

被 CORS 策略阻止:从 Amazon S3 调用图像时没有“Access-Control-Allow-Origin”标头

是否可以为 iframe 设置 Origin Header?

当 Cocoa 应用程序中的主线程被阻塞时,UI 不会更新

EclipseLink - 在执行查询期间从该行读取的主键被检测为空。主键不能包含 null