使用弹簧安全性在后端启用 CORS 的正确方法是啥。在 REST 框架的项目中也使用 Apache cxf

Posted

技术标签:

【中文标题】使用弹簧安全性在后端启用 CORS 的正确方法是啥。在 REST 框架的项目中也使用 Apache cxf【英文标题】:What is the proper way to enable CORS on back end using spring security. Also using Apache cxf in the project for REST framework使用弹簧安全性在后端启用 CORS 的正确方法是什么。在 REST 框架的项目中也使用 Apache cxf 【发布时间】:2019-06-05 16:03:23 【问题描述】:

我有以下代码 sn-p(以及其他一些配置)。还应该做些什么?来自chrome的错误是: “对预检请求的响应未通过访问控制检查:请求的资源上不存在 'Access-Control-Allow-Origin' 标头。”

SC: Screenshot for ResponseHeaders from the page to which rxjs(Using angular) call is made

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true)
protected  class OAuth2SecurityConfiguration extends WebSecurityConfigurerAdapter 
@Override
    protected void configure(HttpSecurity http) throws Exception 
        http
        .cors().and()
        .csrf().disable()
        .anonymous().disable()
        .authorizeRequests()
        .antMatchers(HttpMethod.OPTIONS,"/oauth/token").permitAll();
    
@Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    protected CorsConfigurationSource corsConfigurationSource()
    
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowCredentials(true);
        configuration.setMaxAge((long) 3600);
        configuration.addAllowedOrigin("*");
        //configuration.setAllowedOrigins(Arrays.asList("*"));
        configuration.setAllowedMethods(Arrays.asList("*"));
        //configuration.setAllowedMethods(Arrays.asList("GET","POST","OPTIONS", "DELETE"));
        configuration.setAllowedHeaders(Arrays.asList("*"));
        //configuration.setAllowedHeaders(Arrays.asList( "x-requested-with","X-requested-with", "authorization", "cache-control", "Content-Type,adminUserId"));
        configuration.setExposedHeaders(Arrays.asList("Access-Control-Allow-Origin","Access-Control-Allow-Credentials"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);

        return source;
    

@Configuration
@EnableResourceServer
protected class ResourceServer extends ResourceServerConfigurerAdapter 

    @Autowired
    @Qualifier("dataSource")
    DataSource dataSource;

    @Bean
    public TokenStore tokenStore() 
        return new JdbcTokenStore(dataSource);
    

    @Override
    public void configure(HttpSecurity http) throws Exception          
        http
        .anonymous().disable()
        .requestMatchers().antMatchers("/rest/services/messagePosting/**")
        .and().authorizeRequests()
        .antMatchers("/rest/services/messagePosting/**")
        .authenticated()
        .and().exceptionHandling().accessDeniedHandler(new OAuth2AccessDeniedHandler());     
    

    @Override
    public void configure(ResourceServerSecurityConfigurer resources)
            throws Exception 
        resources.resourceId("my-rest-services");
    

【问题讨论】:

@dur 响应代码是 200 我正在添加一些我们正在使用的配置。 【参考方案1】:

更新:此解决方案仅适用于 Spring-boot。 不记得确切的场景,但我猜是在 OAuth2 配置中,当我在扩展 WebSecurityConfigurerAdapter 的配置类中配置 CORS 时遇到了类似的问题,但这没有帮助。 我找到的解决方案是在一个单独的 java 类中配置 CORS,并将该类导入你的 spring 安全配置类。如下:

@Configuration
public class CorsConfig    

    @Bean
    public FilterRegistrationBean<Filter> customCorsFilter() 
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<Filter>(new CorsFilter(source));
        bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return bean;
    

您的安全配置类(注意导入注释):

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true)
@Import(CorsConfig.class)
protected  class OAuth2SecurityConfiguration extends WebSecurityConfigurerAdapter 
@Override
    protected void configure(HttpSecurity http) throws Exception 
        http
        .cors().and()
        .csrf().disable()
        .anonymous().disable()
        .authorizeRequests()
        .antMatchers(HttpMethod.OPTIONS,"/oauth/token").permitAll();
    

【讨论】:

FilterRegistrationBean 类在哪里?春季启动?我们没有使用弹簧靴。 是的,它是一个 Spring 引导类。添加此答案。 有什么理由拒绝投票吗?这是 Spring-boot 应用程序的一个经过尝试的解决方案,我在这里清楚地提到了“spring-boot”。我没有删除答案,它可能对 Spring-boot 用户有用。

以上是关于使用弹簧安全性在后端启用 CORS 的正确方法是啥。在 REST 框架的项目中也使用 Apache cxf的主要内容,如果未能解决你的问题,请参考以下文章

keycloak CORS 过滤器弹簧靴

如何从服务器端启用 CORS?

弹簧安全 CORS 过滤器

弹簧安全CORS过滤器

弹簧安全CORS过滤器

弹簧安全CORS过滤器