Spring Boot CORS通过配置启用

时间:2019-09-06 06:34:57

标签: spring-boot cors

我在春季读了很多有关CORS的文章(引导),但是没有人可以回答我的问题,但是也许我只是错过了答案,所以请耐心等待。 我有一个REST Web服务,当前仅用于服务器到服务器的调用。我现在想打开一些端点,这些端点可以直接从浏览器中调用,而不是从同一域(即CORS)中调用。我通过做两件事使它在某些端点上起作用: 1.在我的WebSecurityConfigurerAdapter中启用选项:

http.authorizeRequests()
   .mvcMatchers(HttpMethod.OPTIONS, 
                "/endpont1", 
                "/endpoint2")
   .permitAll()

2。在这些端点的我的@GetMapping中添加以下注释:

@CrossOrigin(origins = "${cors.origin}", allowCredentials = "true", 
                         exposedHeaders = ResponseUtils.CONTENT_DISPOSITION)
@GetMapping("/endpoint1")

据我所知,问题是,将原点留空允许任何域的CORS。而且,如果我不需要CORS,我也不想允许OPTIONS。

通过属性文件使其可配置的最佳方法是什么?

应该禁用“嵌入式” application.properties,但是如果租户想要启用它,我们可以提供一个附加的application-tenant.properties,在其中我们可以为某些域启用它,并使用适当的配置文件启动该应用程序。

编辑:我在另一篇帖子中找到了一个有趣的答案,也许我可以有条件地这样做: https://stackoverflow.com/a/43559288/3737177

2 个答案:

答案 0 :(得分:1)

事实是,您无法使用application.properties文件设置全局CORS配置。您必须按照here的说明使用JavaConfig。

implements WebMvcConfigurer

并覆盖下面的方法

 @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
            .allowedOrigins("http://domain4.com")
            .allowedMethods("PUT", "DELETE")
            .allowedHeaders("header1", "header2", "header3")
            .exposedHeaders("header1", "header2")
            .allowCredentials(false).maxAge(4200);
    }

或 在Application.java中添加以下代码段

@Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/greeting-javaconfig").allowedOrigins("http://localhost:9000");
            }
        };
    }

我认为您可以在属性文件中添加属性,并在此处的代码中使用这些属性,并且根据不同的风格,您可以覆盖这些属性。

答案 1 :(得分:0)

经过几次尝试和错误,我找到了基于this答案的有效解决方案:

@Configuration
@EnableConfigurationProperties
@Order(1)
public class EndpointSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private RequestMatcher requestMatcher;

    @Value("${cors.origins:}")
    private String corsOrigins;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        if (StringUtils.isNotBlank(corsOrigins)) {
            http.cors().configurationSource(buildConfigurationSource());
        }
        http.requestMatchers().mvcMatchers("/endpoint1", "/pendpoint2")
        .and().csrf().requireCsrfProtectionMatcher(requestMatcher)
        .and().authorizeRequests().anyRequest()
                .hasAnyRole(SecurityConfiguration.ROLE_ENDPOINT_USER, SecurityConfiguration.ROLE_ADMIN)
        .and().httpBasic();
    }

    private CorsConfigurationSource buildConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList(corsOrigins.split(",")));
        configuration.setAllowedMethods(Arrays.asList("GET");
        configuration.setAllowedHeaders(Arrays.asList("authorization"));
        configuration.setAllowCredentials(true);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/endpoint1", configuration);
        source.registerCorsConfiguration("/endpoint2", configuration);
        return source;
    }

}

如果cors.origins中有一个application-tenant.properties属性,它将启用CORS并配置允许的方法和标头。相同来源请求也启用了CSRF。