当 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的主要内容,如果未能解决你的问题,请参考以下文章
被 CORS 策略阻止:从 Amazon S3 调用图像时没有“Access-Control-Allow-Origin”标头