在我的应用程序中,我使用 grails-spring-security-rest 插件,目前正处于构建身份验证流程的阶段。
如果我使用休息客户端,一切都会按预期工作:我可以通过在 json 中发布用户名和密码来登录并取回令牌。完美的!
现在,我正在尝试将整个事情与网络表单集成,当然,浏览器会发送预检OPTIONS
要求。
我有一个简单的拦截器设置:
@GrailsCompileStatic
class CorsInterceptor {
int order = HIGHEST_PRECEDENCE
CorsInterceptor() {
matchAll() // match all controllers
//.excludes(controller:"login") // uncomment to add exclusion
}
boolean before() {
String origin = request.getHeader("Origin");
boolean options = "OPTIONS".equals(request.getMethod());
if (options) {
if (origin == null) return;
response.addHeader("Access-Control-Allow-Headers", "origin, authorization, accept, content-type, x-requested-with");
response.addHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS");
response.addHeader("Access-Control-Max-Age", "3600");
}
response.addHeader("Access-Control-Allow-Origin", origin == null ? "*" : origin);
response.addHeader("Access-Control-Allow-Credentials", "true");
true // proceed to controller
}
boolean after() { true }
void afterView() {
// no-op
}
}
拦截器可以完美地获取有效的获取请求并将标头添加到响应中。但是,当我尝试发送此消息时:
curl -X "OPTIONS" "http://localhost:8080/api/login" \
-H "Origin: http://localhost:3000" \
-H "Content-Type: application/json" \
-d "{\"username\":\"customer\",\"password\":\"password\"}"
我总是得到405 Method Not Allowed
返回并且执行根本没有到达拦截器。
我的假设是插件提供的登录控制器不允许这样做,我需要添加一个额外的 URL 映射来解决这个问题。我的问题是,这个映射支持是什么样的?
另外,可以设置适用于所有 OPTIONS 请求的映射,因此我不需要一一指定它们?
鉴于这一切,这只是我的假设......我的方向正确吗?
Thanks,