在 Spring Security 上具有不记名身份验证的 CORS

Posted

技术标签:

【中文标题】在 Spring Security 上具有不记名身份验证的 CORS【英文标题】:CORS with bearer authentication on Spring Security 【发布时间】:2018-11-15 23:44:39 【问题描述】:

在我的设置中,我在 zuul 网关后面有一个服务,配置了 Spring Security;我的客户端是一个向网关执行 AJAX 请求的简单网站。

我将 CrossOrigin-Annotation 放置在服务控制器的端点上,因此直接向服务执行请求通过, 将请求指向网关当前在我的 OPTIONS 请求中出现 401 错误。

似乎带有 Authorization Header 的请求没有到达 Spring Security,因为现在不允许使用此标头。

目前我扩展了 WebSecurityConfigurerAdapter 以允许所有选项请求。

编辑: 问题:如何将 Spring Security 配置为不需要对 OPTIONS 请求进行身份验证?

编辑2: 我用相关代码创建了一个GIST:

客户:hello.js, index.html 网关:WebSecurityonfig.javaSimpleCORSFilter.javaGatewayApp.java 服务:ContactController.java

编辑2: 在收集有关 OPTIONS-Preflight 和 Spring (Security) 的更多信息后,问题似乎来自 Spring Security。

我们使用不记名令牌来授权客户端,因此浏览器会向服务器发送一个 OPTIONS-Preflight 请求。服务器由 Spring Security 保护,它找不到有效的授权标头,因此返回 401-unauthorized

【问题讨论】:

你的问题是? 【参考方案1】:

我知道我的回答有点离题,但我通常处理这个问题的方式是使用 http 服务器(如 nginx)。该服务器是前端,在后端或前端重定向请求(因此,从浏览器的角度来看,所有服务器都在同一个域中)。

【讨论】:

老实说,我也会这样做,但不幸的是我无法控制这一点。我们有一个用于前端的域,一个用于后端。【参考方案2】:

您必须在 CrossOrigin 注释中指定允许的来源。

@CrossOrigin(origins = "http://allowed-domain.com")

这里有一个例子:https://spring.io/blog/2015/06/08/cors-support-in-spring-framework

【讨论】:

我的服务中已经有了这个,如果我在没有网关的情况下直接调用服务,这会非常好用,但不幸的是我必须使用网关。我也可以在那里使用这个注释吗? 如果网关始终使用定义的 IP 范围,您可以将它们包含在 @CrossOrigin 中。否则,我认为您必须在服务器端允许 OPTION 方法。 我将如何允许OPTION 方法 看来,请求没有到达服务,但已经被网关拒绝 要允许OPTION,您可以使用:***.com/questions/41075850/…

以上是关于在 Spring Security 上具有不记名身份验证的 CORS的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security permitAll() 匹配器被忽略

Spring security - oauth2 资源服务器测试

Struts2 + Spring Security 2.06:尝试在 Action 方法上使用 @Secured 时,Valuestack 为空

在 asp.net vnext 上使用不记名令牌身份验证刷新令牌

Spring Security 5.1 - 使用 WebClient 获取客户端凭证流的令牌

java - 如何从Java Spring Boot中的请求标头获取不记名令牌?