我在春季读了很多有关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
答案 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。