@CrossOrigin 注解 http.csrf().disable() 有啥区别?

Posted

技术标签:

【中文标题】@CrossOrigin 注解 http.csrf().disable() 有啥区别?【英文标题】: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")

所以,

    这是正确的方法吗?使用这个有什么陷阱吗? 这两个有什么区别,我以前的方法缺少什么。 我有 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 配置而不是注解。 【参考方案1】:

是的,你的做法是正确的

请检查网址

    https://spring.io/blog/2015/06/08/cors-support-in-spring-framework 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 设置。

以上是关于@CrossOrigin 注解 http.csrf().disable() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Spring @CrossOrigin 注解原理(转)

使用注解@CrossOrigin解决跨域问题

springboot的@CrossOrigin注解解决细粒度的配置跨域

springboot之跨域访问cros,@CrossOrigin注解

注解@CrossOrigin解决跨域问题

SpringBoot跨域(CORS)支持:注解@CrossOrigin