【问题标题】:spring security with angular2 giving 403 forbidden error only on POST,PUT and deletespring security with angular2 仅在 POST、PUT 和 delete 上给出 403 禁止错误
【发布时间】:2017-08-11 03:16:20
【问题描述】:

我有 spring mvc(rest)、spring security(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);
}

【问题讨论】:

  • 请看我的原帖,我已经添加了cors config。此外,此过滤器是我的 spring 安全配置中的第一个过滤器,因此它可以在 spring 安全过滤器之前拦截所有请求。

标签: angular spring-security spring-restcontroller


【解决方案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 ;
    }
}

【讨论】:

    猜你喜欢
    • 2019-04-02
    • 2014-09-29
    • 2020-07-31
    • 2017-11-11
    • 2018-05-23
    • 2021-09-04
    • 1970-01-01
    • 2020-12-18
    • 2018-11-22
    相关资源
    最近更新 更多