【发布时间】:2019-05-25 09:50:18
【问题描述】:
我开发了一个带有 spring webflux 后端的 Angular 应用程序。到目前为止,CorsFilter 工作正常并允许来自前端的请求。
然后我添加了一个 SecurityConfig。从那时起,CorsFilter 停止工作,我在 Angular 应用程序中遇到异常:
从源“http://localhost:4200”访问“http://localhost:8080/users/999/folders/%2F/media/”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”标头出现在请求的资源上
这个过滤器效果很好:
@Configuration
public class CorsFilter {
private static final String FRONTEND_LOCALHOST = "http://localhost:4200";
private static final String FRONTEND_STAGING = "https://somehost.github.io";
@Bean
CorsWebFilter corsWebFilter() {
CorsConfiguration corsConfig = new CorsConfiguration();
corsConfig.applyPermitDefaultValues();
corsConfig.addAllowedMethod(HttpMethod.PUT);
corsConfig.addAllowedMethod(HttpMethod.DELETE);
corsConfig.setAllowedOrigins(Arrays.asList(FRONTEND_LOCALHOST, FRONTEND_STAGING));
UrlBasedCorsConfigurationSource source =
new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", corsConfig);
return new CorsWebFilter(source);
}
}
然后我使用以下 SecurityConfig 添加了授权(不记名令牌):
@EnableWebFluxSecurity
@EnableReactiveMethodSecurity
public class SecurityConfiguration {
@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
http.cors().and().csrf()
.csrfTokenRepository(CookieServerCsrfTokenRepository.withHttpOnlyFalse())
.and()
.authorizeExchange()
.anyExchange().authenticated()
.and()
.oauth2ResourceServer()
.jwt();
return http.build();
}
似乎不再考虑我的 CorsFilter 安全配置。我认为需要在配置中明确添加 corsfilter,但我发现的示例不起作用。我希望有人可以提供帮助并知道原因。
编辑:为了解决重复问题:我已经尝试将 cors() 和 cors().configurationSource(corsConfig()) 添加到我的安全配置中,但也没有帮助。
【问题讨论】:
-
感谢您一直以来的帮助:),我已经完成了。我现在找到了解决方案。将作为答案发布。
-
这是一个老问题,但它是唯一对我有用的答案。它也不是重复的@jww,因为您的链接中的配置是针对非反应性 java 而这个问题和答案是关于反应性 java。
标签: spring spring-security cors spring-webflux