【问题标题】:What's the difference between @CrossOrigin annotation http.csrf().disable()?@CrossOrigin 注解 http.csrf().disable() 有什么区别?
【发布时间】:2019-05-31 18:01:16
【问题描述】:

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

我有一个第 3 方仪表板,它通过 iFrame 管理我的前端。但它直接通过它的搜索小部件调用我的搜索 api。下面提到的代码仅解决此搜索 API 的 CORS 问题并发送此错误 ,所有其他 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. 这两个有什么区别,我以前的方法缺少什么。
  3. 我有 3 个阶段 (dev/stage/prod),我可能需要在其中添加此 @CrossOrigin 注释,以及如何继续的任何建议。我可以使用配置文件,但 prod 没有特定的 -prod 标签,例如dev 和 stage 具有以下 url dashboard-dev.com/dashboard-stage.com。但 prod 只有 dashboard.com。

【问题讨论】:

  • CORS 和 CSRF 是完全不同的东西。你读过关于两者的东西吗?维基百科或 Spring Security 参考?
  • 我对安全的了解有点有限。您是否建议上面的 http.cors() 对上面屏幕截图中的错误没有帮助?
  • 不,我不建议这样做。您遇到了 CORS 问题,并且您已经使用 http.cors()@CrossOrigin(origins = "https://dashboard-url") 解决了它。
  • 所以回答我的第一个问题,这是正确的做法。这是解决此问题的唯一方法。 ?
  • 是的,这是正确的方法。不,这不是唯一的方法。你也可以使用 CORS 配置而不是注解。

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


【解决方案1】:

是的,你的做法是正确的

请检查网址

  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;
    }

【讨论】:

  • 我能知道为什么它是负面的吗?我的意思是正确的解决方案是什么。
  • 某人的-1有点苛刻。我要补充一点,您还可以使用 @CrossOrigin 注释在控制器类/方法级别定义 CORS 设置。
猜你喜欢
  • 2014-12-29
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 2012-02-18
  • 2015-01-01
  • 2018-09-04
相关资源
最近更新 更多