Spring Boot OAuth2 CORS 在版本 2.2.1 中不起作用

Posted

技术标签:

【中文标题】Spring Boot OAuth2 CORS 在版本 2.2.1 中不起作用【英文标题】:Spring boot OAuth2 CORS not working in version 2.2.1 【发布时间】:2020-03-23 17:55:47 【问题描述】:

当访问 Spring Boot 服务器时,它显示以下错误: Access to XMLHttpRequest at 'http://localhost:8080/oauth/token' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

我的配置是, http.cors();

    CorsConfigurationSource corsConfigurationSource() 
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("http://localhost:4200"));
        configuration.setAllowedMethods(Arrays.asList("GET","POST","OPTIONS"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    ```

【问题讨论】:

在***.com/a/52227060/441757和***.com/a/44773723/441757和***.com/a/58475597/441757和***.com/a/53893204/441757查看答案 【参考方案1】:

如果您提供这样的配置,Springboot 基本上会处理 cors 配置,但在您的情况下,这可能是因为 spring 安全性没有在您的响应标头中添加像 Access-Control-Allow-Origin 这样的 CORS 标头。当您发出 ajax 请求时, pre-flight 检查请求最初是向服务器发出的,服务器用一组 headers 响应,用于确定服务器是否支持 cors 请求。 当您添加 cors 配置时,来自浏览器的飞行前检查现在将由 Spring MVC 处理,但我们需要告诉 Spring Security 允许它通过,您可以通过添加像您这样的 cors 配置 bean 来完成提供,但您需要设置 http.cors 喜欢:

http.cors().and().authorizeRequests()
  .anyRequest().authenticated(); 

以便对飞行前请求进行身份验证。

如果问题仍然存在(通过添加自定义过滤器): 因此,尝试添加一个过滤器以正确设置 CORS 标头(请根据需要从端点返回正确设置标头):

public class CorsFilter implements Filter 

    @Override
    public void init(FilterConfig filterConfig) throws ServletException 

    

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException 
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpServletRequest request= (HttpServletRequest) servletRequest;

        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "GET,POST,DELETE,PUT,OPTIONS");
        response.setHeader("Access-Control-Allow-Headers", "*");
        response.setHeader("Access-Control-Allow-Credentials", true);
        response.setHeader("Access-Control-Max-Age", 180);
        filterChain.doFilter(servletRequest, servletResponse);
    

    @Override
    public void destroy() 

    

当您在配置中设置http.cors() 时,它将从spring security 中排除飞行前检查。

【讨论】:

以上是关于Spring Boot OAuth2 CORS 在版本 2.2.1 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

spring boot with react前端oauth2代理CORS问题

如何使用密码授予在 Spring Boot Oauth2 资源服务器中处理 CORS

Spring Boot OAuth2 CORS 在版本 2.2.1 中不起作用

带有 Google 的 OAuth2 - CORS 错误(Angular + Spring boot)[重复]

Spring boot Oauth2 + Angular CORS问题

如何在 Spring Boot 2.x 中将 CORS 添加到 oauth2/resource 服务器?