@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() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
springboot的@CrossOrigin注解解决细粒度的配置跨域