Spring-CORS不使用安全配置

Spring-CORS不使用安全配置,spring,spring-security,cors,spring-webflux,Spring,Spring Security,Cors,Spring Webflux,我开发了一个带有SpringWebFlux后端的angular应用程序。到目前为止,CorsFilter运行良好,允许来自前端的请求 然后我添加了一个SecurityConfig。从那时起,CorsFilter停止工作,我在angular应用程序中遇到一个异常: CORS策略已阻止从源“”访问“”处的XMLHttpRequest:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许源”标头 此过滤器工作正常: @Configuration public class CorsFi

我开发了一个带有SpringWebFlux后端的angular应用程序。到目前为止,CorsFilter运行良好,允许来自前端的请求

然后我添加了一个SecurityConfig。从那时起,CorsFilter停止工作,我在angular应用程序中遇到一个异常:

CORS策略已阻止从源“”访问“”处的XMLHttpRequest:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许源”标头

此过滤器工作正常:

@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())
添加到我的安全配置中,但都没有帮助。

尝试添加此配置

corsConfig.setAllowCredentials(true);
我通过实现一个定制的公司过滤器找到了一种可行的方法

然而,我仍然对这个解决方案不满意,因为它看起来很像一个解决方案

最后我找到了罪犯。。。一个是相当尴尬的。我发布的SecurityConfig位于错误的包中(它意外地位于默认包中),因此配置没有被选中

当我将代码粘贴到securityconfig时,问题中的cors过滤器也开始工作

因此,我的最终SecurityConfig如下所示:

import java.util.Arrays;

import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.method.configuration.EnableReactiveMethodSecurity;
import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.web.server.SecurityWebFilterChain;
import org.springframework.security.web.server.csrf.CookieServerCsrfTokenRepository;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsConfigurationSource;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;

@EnableWebFluxSecurity
@EnableReactiveMethodSecurity
public class SecurityConfiguration {

    private static final String FRONTEND_LOCALHOST = "http://localhost:4200";
    private static final String FRONTEND_STAGING = "https://somehost.github.io";

    @Bean
    public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
        http
                .csrf()
                .csrfTokenRepository(CookieServerCsrfTokenRepository.withHttpOnlyFalse())
                .and()
                .authorizeExchange()
                .anyExchange().authenticated()
                .and()
                .oauth2ResourceServer()
                .jwt();
        return http.build();
    }


    @Bean
    CorsConfigurationSource corsConfiguration() {
        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 source;
    }
}

谢谢你的提示,但我使用不记名代币,所以我不发送任何凭证。所以这不是你继续帮助的问题:),我已经经历过了。我现在找到了解决办法。这可能是一个老问题的重复,但这是唯一对我有效的答案。它也不是重复的@jww,因为链接中的配置是针对非反应性java的,而这个问题和答案是关于反应性java的。