弹出安全性与angular2只在POST,PUT和删除时给出403禁止错误

时间:2017-03-19 23:16:48

标签: angular spring-security spring-restcontroller

我有弹簧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);
}

1 个答案:

答案 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 ;
    }
}