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

Posted

技术标签:

【中文标题】如何在 Spring Boot 2.x 中将 CORS 添加到 oauth2/resource 服务器?【英文标题】:How to add CORS to outh2/resource server in Spring Boot 2.x? 【发布时间】:2020-11-09 02:12:24 【问题描述】:

我有一个 oauth 服务器和一个使用 JWT 创建的资源服务器。

我还创建了一个带有 2 个按钮的角前端:

第一个按钮调用鉴权服务器,获取JWT令牌并添加到输入框。

第二个按钮使用 JWT 令牌作为承载授权 http 标头调用其余服务器。

从 PostMan 调用 2 项服务可以完美运行,但我无法为后端服务正确配置 CORS 设置。

两个按钮都给我以下错误:

Access to XMLHttpRequest at 'http://localhost:8085/oauth/token' from origin 'http://localhost:4200' has been blocked by CORS policy: Request header field authorization is not allowed by Access-Control-Allow-Headers in preflight response.

我将所有 3 个项目添加到我的公共 github repo。

我尝试了几种方式添加 CORS:

资源休息服务上的配置较小,所以我将在此处概述 我尝试在HttpSecurity 上添加默认的.cors(),并在corsConfigurationSource() 方法中手动设置。

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(final HttpSecurity http) throws Exception 
        http.csrf().disable()
                .cors()
                .and().authorizeRequests().anyRequest().authenticated()
                .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER);

        //I tried manually configured the cors as well
        /*http.csrf().disable()
                .cors().configurationSource(corsConfigurationSource())
                .and().authorizeRequests().anyRequest().authenticated();
                .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER);*/
    

   /* @Bean
    CorsConfigurationSource corsConfigurationSource() 
        final CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("*"));
        configuration.setAllowedMethods(Arrays.asList("GET", "POST"));
        configuration.setAllowCredentials(true);
        //the below three lines will add the relevant CORS response headers
        configuration.addAllowedOrigin("*");
        configuration.addAllowedHeader("*");
        configuration.addAllowedMethod("*");
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    
  */

我也尝试添加一个 servlet 过滤器

@Component @Order(Ordered.HIGHEST_PRECEDENCE) 公共类 SimpleCorsFilter 实现 Filter @Override public void init(final FilterConfig filterConfig) throws ServletException


@Override
public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws

IOException, ServletException

    final HttpServletResponse response = (HttpServletResponse) servletResponse;
    final HttpServletRequest request = (HttpServletRequest) servletRequest;

    response.addHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "content-type, x-requested-with, authorisation");

    if ("OPTIONS".equalsIgnoreCase(request.getMethod())) 
        response.setStatus(HttpServletResponse.SC_OK);
     else 
        filterChain.doFilter(servletRequest, servletResponse);
    


@Override
public void destroy() 

 

只是无法让它工作。有人可以在这里给我一些指导吗?

【问题讨论】:

找到解决办法了吗? @NafazBenzema 我做到了。请看下面我的回答。这只是一个拼写错误。看看你得到的错误。就我而言,我得到的 CORS 错误告诉我不允许授权。我从浏览器复制了标题并在我的代码中搜索它,但找不到它。然后我正确地查看了每个标签 【参考方案1】:

使用 withWebMvcConfigurer 而不是 WebSecurityConfigurerAdapter 扩展您的类。覆盖以下方法:

    @Override
    public void addCorsMappings(CorsRegistry registry) 
        registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET", "POST", "PUT", "PATCH", "DELETE").allowedHeaders("*");
    

它应该添加原点。你可以玩'*'并进行多种组合。我已经给了你想法,现在轮到你玩这个 API了。

【讨论】:

【参考方案2】:

在我的两个 SimpleCorsFilter.java 文件中我都指定了 authorisation 标头标签是允许的,但它不是使用 S 而是使用 Z 授权。

更改我的配置服务器中的两个文件

response.setHeader("Access-Control-Allow-Headers", "content-type, x-requested-with, Authorization");

【讨论】:

以上是关于如何在 Spring Boot 2.x 中将 CORS 添加到 oauth2/resource 服务器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中将属性文件值读入字符串集

如何在spring boot gradle项目中将时间戳附加到jar?

如何在 Wildfly 中将外部属性文件加载到 Spring Boot

如何在spring boot中将@Value属性从application.properties注入@InjectMocks?

如何在 Spring Boot 中将嵌套的 JSON 对象映射为 SQL 表行

如何在 Spring Boot 应用程序中将用户添加到嵌入式 tomcat?