@CrossOrigin批注http.csrf()。disable()有什么区别?

时间:2019-01-05 10:49:48

标签: spring-boot authentication spring-security cors keycloak

此问题与Disable Keycloak authentication for a specific url in spring-boot

有关

我有一个第三方仪表板,可通过iFrame管理前端。但是它直接通过其搜索小部件调用了我的搜索API。下面提到的代码仅解决了此搜索API的CORS问题,并发送了此错误 enter image description here ,所有其他API都能正常运行。

    @Override
protected void configure(@Nonnull final HttpSecurity http) throws Exception {
    super.configure(http);

    http.csrf().disable();

    http
            .cors()
            .and()
            .authorizeRequests()
            .antMatchers("/health", "/error").permitAll()
            .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
            .anyRequest().authenticated();
}

现在,我在控制器上添加了以下代码,它开始工作:

@CrossOrigin(origins = "https://dashboard-url")

所以

  1. 这是正确的方法吗?使用这个有什么陷阱吗?
  2. 这2个之间有什么区别?我以前的方法缺少什么。
  3. 我有3个阶段(dev / stage / prod),可能需要在其上添加此@CrossOrigin批注,以及有关如何进行操作的任何建议。我可以使用配置文件,但是prod没有特定的 -prod 标签,例如dev和stage包含以下URLdashboard-dev.com/dashboard-stage.com。但是产品仅具有dashboard.com。

1 个答案:

答案 0 :(得分:-1)

是的,您所做的是正确的

请检查URL

  1. https://spring.io/blog/2015/06/08/cors-support-in-spring-framework
  2. https://docs.spring.io/spring-security/site/docs/5.1.3.RELEASE/reference/html5/#cors

如果您使用的是Spring Security,请确保同时在Spring Security级别启用CORS,以使其能够利用Spring MVC级别定义的配置。

因此,根据您的编码,您已经使用http.cors()在安全性上启用了cors,并且由于未定义corsConfigurationSource(CORS过滤器),因此它使用了通过@CORS(***)定义的MVC级别。

但是,如果您希望这些值是动态的,则可以将其与基于env的外部文件中的值一起使用,如下所示

@Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("https://example.com"));
        configuration.setAllowedMethods(Arrays.asList("GET","POST"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }