带有 Spring Security 核心和 CORS 插件的 grails REST API 不适用于 OPTIONS http 方法请求
Posted
技术标签:
【中文标题】带有 Spring Security 核心和 CORS 插件的 grails REST API 不适用于 OPTIONS http 方法请求【英文标题】:grails REST API with Spring Security core and CORS plugins not working for OPTIONS http method requests 【发布时间】:2013-10-29 03:55:46 【问题描述】:尝试从 AngularJS 前端向其他服务器上的 Grails 2.3.1 RESTful 服务执行跨域请求 [CORS]。
对于任何跨域请求,AngularJS 首先发送 OPTIONS http 请求。
为了支持这一点,我在我的控制器中添加了以下方法来扩展 RestfulController
static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE", options: "OPTIONS", trace: "TRACE", head: "HEAD"]
@Secured(value=['permitAll'], httpMethod='OPTIONS')
def options()
log.debug("i am in options method")
response.setHeader("Allow", "GET,POST,PUT,DELETE,OPTIONS,TRACE,HEAD")
return
对于下面的 cURL 命令,我的控制器上的 options() 方法永远不会被调用。 curl 总是得到 301 响应。
curl -H "Origin: http://example.com" -X OPTIONS --verbose http://localhost:8080/Console/tenants/1/spaces.xml
这是 Spring Security 核心插件中的错误还是我遗漏了什么?
我的环境由 Grails 2.3.1、Spring Security Core 和 ACL 2.0-RC1 插件和 CORS 插件 1.1.1 组成
【问题讨论】:
【参考方案1】:这是因为浏览器会在您执行操作之前检查跨域请求。您可以使用 servlet 过滤器来做到这一点,或者只使用 CORS Grails plugin。
【讨论】:
我正在使用 CORS Grails 插件。如果我发送静态页面请求,例如:[curl -H "Origin: example.com" -X OPTIONS --verbose localhost:8080/Console/index.html] 但是当我向 RestfulController URL 发送相同的 OPTIONS 请求时,例如:[localhost:8080/Console/tenants/1/spaces.xml],它总是获得 301 响应,其中包含对 auth url 的位置。不知道是RestfulController还是Spring Security Core Plugin引起的。 “不是一个有效的 http 方法”?严重地?你的意思是他们没有实现这个方法对吧? @TobiasHagenbeek 我之前的回答不正确,OPTIONS 有效 - developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS,很难记住 2013 年回答的上下文:( 呵呵,是的,很遗憾,我读了我的评论,听起来可能不像... :) 很高兴你在这么久之后仍然回来!【参考方案2】:使用最新的 CORS Grails 插件解决了这个问题。它包括一个拦截 OPTIONS 请求并提供响应的过滤器。
【讨论】:
以上是关于带有 Spring Security 核心和 CORS 插件的 grails REST API 不适用于 OPTIONS http 方法请求的主要内容,如果未能解决你的问题,请参考以下文章
第九篇SpringSecurity核心过滤器-SecurityContextPersistenceFilter
第九篇SpringSecurity核心过滤器-SecurityContextPersistenceFilter
Spring Security + Thymeleaf - 第二次登录后的 TemplateInputException
带有 Spring Security 登录和身份验证的 Angular
带有 spring-boot 和 spring-security 的 JWT
如何使用带有多个过滤器和 Spring Security 的 Spring DelegatingFilterProxy?