我应该在 Spring 后端禁用 CORS 吗?未经授权的请求被阻止

Posted

技术标签:

【中文标题】我应该在 Spring 后端禁用 CORS 吗?未经授权的请求被阻止【英文标题】:Should I disable CORS in spring backend? Unathorized request is blocked 【发布时间】:2020-04-29 02:47:46 【问题描述】:

我正在使用 Spring Boot 和 Vue 开发项目,我需要保护我的端点。用户将具有特定角色、管理员角色或典型用户角色。当我搜索如何配置 JWT 和 spring 安全性的教程时,我收到了 cors().disable() only 的禁用 cors 的文章。这就是我的问题.. 如果 spring 后端中的 cors 被禁用,我可以通过 axios 从我的前端 Vue 应用程序发送请求吗?禁用它是正确的方法吗?我的很多来自 api 的请求都被 cors 阻止了,所以我启用了它,但我没有实现用户角色,这让我很困惑现在该怎么做,因为我必须这样做......另一个问题是当我实现 httpSecurity.csrf().disable().authorizeRequests().antMatchers("/authenticate", "/register","/login").permitAll().并尝试从同一网络中的另一台设备调用 /authenticate 然后弹簧阻止它但它不应该被阻止.. 在控制器顶部我有 @CrossOrigin(origins="*", maxAge=3600)@RestController 所以我不知道为什么我的请求被阻止. 如果你有一些想法,请帮助我。 最好的问候!

【问题讨论】:

配置:httpSecurity.csrf().disable() .authorizeRequests().antMatchers("/authenticate", "/register","/login").permitAll(). antMatchers(HttpMethod.OPTIONS, "/**").permitAll(). anyRequest().authenticated().and(). exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPoint).and().sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS); httpSecurity.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class); httpSecurity.cors(); CORS 允许您的后端 api “交谈”以从不同的来源请求。如果您正在创建 api 服务,并且希望允许来自不同地方、Vue 应用程序、移动应用程序等的请求,您将需要 CORS。如果您禁用 CORS,您的 api 将只允许来自与您的主机相同的主机的请求api服务。 【参考方案1】:

将此设置在每个控制器的顶部

@CrossOrigin(origins = "*") 
@RestController

并在 SecuriyConfig 中设置代码如下。它对我有用。

httpSecurity.cors()
            .and()
            .csrf()
            .disable()
            .exceptionHandling()
            .authenticationEntryPoint(jwtAuthenticationEntryPoint)
            .and()
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .authorizeRequests()
            .antMatchers("/",
                    "/favicon.ico",
                    "/**/*.png",
                    "/**/*.ttf",
                    "/**/*.woff",
                    "/**/*.woff2",
                    "/**/*.gif",
                    "/**/*.svg",
                    "/**/*.jpg",
                    "/**/*.jpeg",
                    "/**/*.html",
                    "/**/*.css",
                    "/**/*.js")
            .permitAll()
            .antMatchers("/authenticate", "/register","/login")
            .permitAll()
            .antMatchers(HttpMethod.OPTIONS, "/**")
            .permitAll()
            .anyRequest()
            .authenticated();

【讨论】:

以上是关于我应该在 Spring 后端禁用 CORS 吗?未经授权的请求被阻止的主要内容,如果未能解决你的问题,请参考以下文章

你能在 Spring 中完全禁用 CORS 支持吗?

[CORS][Spring Security] PreFlight 请求未处理

如何在 Spring Boot 安全性中禁用 CORS

如何在 Spring Boot 安全性中禁用 CORS

Express 默认会禁用 CORS 吗?

Keycloak Spring boot 后端和 Angular 前端,CORS 错误