我有弹簧mvc(休息),弹簧安全(4.x)和angular2应用程序。应用程序部署在weblogic中,它负责SAML身份验证,因此我的应用程序只使用授权部分。为此,我们使用自定义请求标头身份验证过滤器,我们验证自定义请求标头,并基于该标头从具有授权权限的db加载用户。这一切都很好。
现在我正在实施CSRF保护,其中我的服务器正在添加CSRF令牌cookie,因为angular2已经开箱即用,因此它会在所有后续请求中将x-xsrf-token传递给相同的cookie。
问题从这里开始,所有GET请求都正常工作,但当我的应用程序执行POST或PUT或DELETE时,它会收到403错误。比较GET和POST请求,我注意到POST请求没有“Access-Control-Allow-Headers”,所以我想我的服务器必须以某种方式暴露这个头,这样浏览器就可以发送X-XSRF-TOKEN用于POST / PUT请求。
GET请求中存在相同的标头。
任何人都可以解释我是否在正确的轨道上?如果是,那么我如何在spring secuirty或spring mvc中为整个应用程序公开这个头文件?
如果没有那么是什么导致了这个问题?
我的CORS配置
<filter>
<filter-name>cors</filter-name>
<filter-class>com.elm.mb.rest.filters.CORSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>cors</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
response.addHeader("Access-Control-Allow-Origin", "*");
if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) {
LOG.trace("Sending Header....");
// CORS "pre-flight" request
response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
response.addHeader("Access-Control-Allow-Headers", "Content-Type,X-XSRF-TOKEN");
response.addHeader("Access-Control-Max-Age", "1");
}
filterChain.doFilter(request, response);
}
答案 0 :(得分:1)
您应该直接返回预检请求,更多请参阅here(不那么简单的请求)。
if (request.getHeader("Access-Control-Request-Method") != null) {
LOG.trace("Sending Header....");
// CORS "pre-flight" request
response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
response.addHeader("Access-Control-Allow-Headers", "Content-Type,X-XSRF-TOKEN");
response.addHeader("Access-Control-Max-Age", "1");
if ("OPTIONS".equals(request.getMethod())) {
return ;
}
}