在 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.java
、SimpleCORSFilter.java
、GatewayApp.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 上使用不记名令牌身份验证刷新令牌