Angular 2带弹簧mvc 4.2.6和弹簧安全4.0.1带CORS过滤器

时间:2017-01-14 16:01:52

标签: spring-mvc angular spring-security

我们有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上提供。

2 个答案:

答案 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添加到允许的方法中。