我们有Spring Security的Angular 2应用程序和REST API的Spring MVC。在我们在前端和后台实现身份验证之前,它运行正常。由于我们添加了简单的基本身份验证,因此我们遇到了将自定义身份验证令牌发送到后端的问题。我有两个过滤器设置,一个是web.xml
中的CORSFilter设置,并且具有这样的代码
if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) {
// CORS "pre-flight" request
response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
response.addHeader("Access-Control-Allow-Headers", "X-AUTH-TOKEN");
response.addHeader("Access-Control-Max-Age", "60000");
}
此过滤器正在拦截所有API请求,如您所见,它允许我们的自定义身份验证令牌。
现在我们进入Spring Security过滤器链,我们在其中使用自定义过滤器来验证该令牌,该令牌尝试从请求标头获取X-AUTH-TOKEN
并始终返回null
。
有谁可以告诉我可能会将此值设置为null
?我确实根据Firefox调试工具检查我的前端是否发送了X-AUTH-TOKEN
正确的值,如果我使用该令牌并使用postman客户端进行REST API调用,那么它也正常工作。使用Chrome或Firefox测试前端时,只会出现问题。
注意:前端在端口4200上提供,后端在端口8080上提供。
答案 0 :(得分:0)
好的,在上面回复的一些线索之后,我意识到在我的自定义Spring安全过滤器中,我试图在每次api请求时访问“x-auth-token”。但是在CORS的情况下,浏览器在提出实际请求之前会先发出OPTIONS预先飞行请求。
添加check以忽略OPTIONS方法后,一切正常。所以现在我的自定义JWT Auth过滤器只检查GET,POST,PUT和DELETE请求中是否存在令牌。
另外根据“dur”的建议,我也删除了自开发以来开发的CORSFilter,因为mvc 4.1.x提供了内置的CORS支持,你可以自定义它,就像它是你自己的自定义过滤器一样。感谢您的“dur”链接。
答案 1 :(得分:-1)
您可能希望将OPTIONS添加到允许的方法中。