Spring-Security OAuth WebMVC 无效的 CORS 请求

Posted

技术标签:

【中文标题】Spring-Security OAuth WebMVC 无效的 CORS 请求【英文标题】:Spring-Security OAuth WebMVC Invalid CORS request 【发布时间】:2016-04-11 04:17:57 【问题描述】:

希望我的最后一个问题能够让所有这些工作。使用 Spring Security OAuth 2.0.8 和 Spring-Web MVC 4.2.3 公开 OAuth 端点(系统的大部分使用 RESTEasy 作为 REST 端点,它有自己的 CORS 过滤器)。

我正在尝试使用 Web MVC 4.2.x 中现在提供的全局默认 CORS 支持。但是,当针对 /oauth/token 端点发出测试预检请求时,我总是收到 403 Invalid CORS Request 响应。 Fiddler 的示例请求如下。

OPTIONS http://localhost:8080/myapp/oauth/token HTTP/1.1
User-Agent: Fiddler
Host: localhost:8080
Origin: http://testfakeorigin.overtherainbow.com
Access-Control-Request-Method: POST

尽管这通过并被确定为正确的预检请求,但看起来该请求在第 81 行的 DefaultCorsProcessor 中失败,因为 CorsConfiguration 为空。即使我在我的 WebMvcConfigurerAdapter 中明确添加了 CORS 注册表映射(根据文档,这不应该是必需的),配置最终仍然为空。接下来我应该看哪里?

【问题讨论】:

查看我对类似问题的回答***.com/a/55463965/1848555 【参考方案1】:

您可以在 @Configuration 类中自定义整个应用程序的 CORS(跨源资源共享),这样您的所有控制器都会被自动覆盖。看看:

@Configuration
@EnableWebSecurity( debug = true )
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class SecurityConfig extends WebSecurityConfigurerAdapter 
     /* ... configurations */
     @Bean
     public FilterRegistrationBean corsFilter() 
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration().applyPermitDefaultValues();
        config.addAllowedMethod(HttpMethod.POST);
        config.addAllowedMethod(HttpMethod.GET);
        config.addAllowedMethod(HttpMethod.PUT);
        config.addAllowedMethod(HttpMethod.DELETE);
        source.registerCorsConfiguration("/**", config);
        FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
        bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return bean;
     

注意:您可以定义将在配置中应用的方法动词

最好的问候!

【讨论】:

【参考方案2】:

在实际的POST 之前,您可能会自动发出OPTIONS 请求。通过default,仅允许您在RequestMapping 中指定的方法。因此,您必须明确允许跨源请求使用 OPTIONS 方法。

使用全局配置的一种方法如下:

@Override
public void addCorsMappings(CorsRegistry registry) 
    registry.addMapping("/**").allowedMethods("GET", "POST", "OPTIONS").allowedOrigins("http://testfakeorigin.overtherainbow.com");

这将为您使用GETPOSTOPTIONS 方法映射的所有请求启用跨源请求。

【讨论】:

我这样做了,但对我来说它不起作用,你可以在这里看到:***.com/questions/39307591/…

以上是关于Spring-Security OAuth WebMVC 无效的 CORS 请求的主要内容,如果未能解决你的问题,请参考以下文章

在使用 Oauth、SAML 和 spring-security 的多租户的情况下从 spring-security.xml 中获取错误

如何使用spring-security,oauth2调整实体的正确登录?

将标头添加到 oauth/token 响应(spring-security)

oauth2 spring-security 成功和失败处理程序

oauth2 spring-security 如果您在请求令牌或代码之前登录

您如何在代理后面使用 spring-security OAuth2,但仅将 ForwardedHeaderTransformer 用于 OAuth 组件