【发布时间】: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