授权标头的 Spring Security OAuth2 CORS 问题

Posted

技术标签:

【中文标题】授权标头的 Spring Security OAuth2 CORS 问题【英文标题】:Spring Security OAuth2 CORS issue for Authorization header 【发布时间】:2016-06-25 02:20:13 【问题描述】:

我使用<spring.version>4.2.0.RELEASE</spring.version><spring.security.version>4.0.2.RELEASE</spring.security.version><spring.security.oauth2.version>2.0.9.RELEASE</spring.security.oauth2.version>

我使用@CrossOrigin 与 CORS 一起使用。现在,我想允许所有标题和所有方法。我可以使用除 Authorization 之外的任何其他标头,而不会出现任何 CORS 问题。但是使用授权(发送不记名令牌的标头),我得到了 CORS 问题。我在类级别使用@CrossOrigin 注释并允许所有标题如下 -

@CrossOrigin(allowedHeaders = "*")

请求中没有“Access-Control-Allow-Origin”标头 资源

我如何允许 Authorization 标头以及所有其他标头并避免 CORS 问题?

【问题讨论】:

【参考方案1】:

您可以将以下内容添加到任何配置文件中:

@Bean
public CorsFilter corsFilter() 
    final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
    final CorsConfiguration corsConfiguration = new CorsConfiguration();
    corsConfiguration.setAllowCredentials(true);
    corsConfiguration.addAllowedOrigin("*");
    corsConfiguration.addAllowedHeader("*");
    corsConfiguration.addAllowedMethod("*");
    urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
    return new CorsFilter(urlBasedCorsConfigurationSource);

编辑 对于 XML 配置,您可以创建一个自定义过滤器并将其添加到您的过滤器链中:

public class CorsFilter implements Filter 

  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException 
    HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "*");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "*");
    chain.doFilter(req, res);
  

  public void init(FilterConfig filterConfig) 

  public void destroy() 


XML 配置

<security:filter-chain-map>
    <sec:filter-chain pattern="/**"
        filters="
        ConcurrentSessionFilterAdmin, 
        securityContextPersistenceFilter, 
        logoutFilterAdmin, 
        usernamePasswordAuthenticationFilterAdmin, 
        basicAuthenticationFilterAdmin, 
        requestCacheAwareFilter, 
        securityContextHolderAwareRequestFilter, 
        anonymousAuthenticationFilter, 
        sessionManagementFilterAdmin, 
        exceptionTranslationFilter, 
        filterSecurityInterceptorAdmin,
        CorsFilter"/>
</security:filter-chain-map>

【讨论】:

我没有注释配置。我的是 XML 配置 -

以上是关于授权标头的 Spring Security OAuth2 CORS 问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Security 自定义 Http 授权标头

授权标头的 Spring Security OAuth2 CORS 问题

传递授权标头时的Spring Security CORS问题[重复]

使用 AngularJS 登录后不存在授权标头时,Spring Security 不会抛出错误

Spring Security JWT - 通过授权标头的邮递员身份验证有效,但从我的 Angular 前端不起作用

如何修复 Spring Security Authorization 标头未通过?