Spring Boot+Angular集成CSRF搭配OAM认证时403问题求助
解决Spring Boot+Angular集成CSRF与OAM认证冲突的403问题
我帮你梳理下当前配置里的几个关键问题,结合OAM认证的特性,一步步来解决:
一、HttpOnly属性不生效的核心原因
你在CookieCsrfTokenRepository里设置了withHttpOnlyFalse(),但自定义的csrfHeaderFilter里手动创建Cookie时没显式设置HttpOnly=false,而Cookie默认的HttpOnly是true,这就覆盖了之前的配置。
修复方式:
修改自定义过滤器的Cookie创建逻辑,加上setHttpOnly(false):
private Filter csrfHeaderFilter() { return new OncePerRequestFilter() { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class.getName()); if (csrf != null) { Cookie cookie = new Cookie("XSRF-TOKEN", csrf.getToken()); cookie.setPath("/"); cookie.setHttpOnly(false); // 必须显式设置这一行! cookie.setSecure(false); // 生产环境HTTPS下改为true response.addCookie(cookie); } filterChain.doFilter(request, response); } }; }
二、Angular与Spring的CSRF头名称不匹配
你的Angular配置里把请求头设为XSRF-TOKEN,但Spring Security的CsrfFilter默认监听的是X-XSRF-TOKEN请求头——这会导致后端识别不到前端发送的CSRF令牌,直接返回403。
对齐配置的两种方案:
方案1:修改Angular配置(推荐,符合Spring默认规范)
HttpClientXsrfModule.withOptions({ cookieName: 'XSRF-TOKEN', headerName: 'X-XSRF-TOKEN' // 和Spring默认监听的头对齐 })
方案2:修改Spring配置(如果必须保留Angular的头名称)
private CsrfTokenRepository csrfTokenRepository() { CookieCsrfTokenRepository repo = CookieCsrfTokenRepository.withHttpOnlyFalse(); repo.setHeaderName("XSRF-TOKEN"); // 和Angular的headerName一致 return repo; }
三、过滤器顺序与重复设置问题
你当前的配置里添加了addFilterAfter(new CsrfFilter(), CsrfFilter.class),这相当于重复添加了Spring自带的CsrfFilter,很可能导致令牌逻辑冲突。
优化建议:
如果没有特殊需求,完全可以去掉自定义的csrfHeaderFilter——CookieCsrfTokenRepository.withHttpOnlyFalse()已经会自动创建XSRF-TOKEN Cookie并设置HttpOnly=false,自定义过滤器属于重复操作,反而容易出问题。
简化后的Spring配置:
@Override protected void configure(HttpSecurity http) throws Exception { http .httpBasic() .and() .csrf() .ignoringAntMatchers(CSRF_IGNORE) .csrfTokenRepository(csrfTokenRepository()) .and() // 去掉重复的CsrfFilter添加逻辑 } private CsrfTokenRepository csrfTokenRepository() { CookieCsrfTokenRepository repo = CookieCsrfTokenRepository.withHttpOnlyFalse(); repo.setCookieName("XSRF-TOKEN"); repo.setHeaderName("X-XSRF-TOKEN"); // 对应Angular修改后的配置 return repo; }
四、OAM认证的冲突排查
OAM作为企业级认证系统,可能会在认证流程中修改或清除Cookie,需要重点检查:
- 打开浏览器开发者工具,查看OAM认证前后
XSRF-TOKENCookie是否被删除或修改; - 确认OAM允许
X-XSRF-TOKEN(或你设置的请求头)通过,没有被拦截; - 检查OAM是否自带CSRF防护机制,如果有,需要关闭其中一方的CSRF,或者配置两者兼容(比如让OAM信任Spring的CSRF令牌)。
最后验证步骤
- 浏览器Application标签页确认
XSRF-TOKEN的HttpOnly属性为false; - Network标签页查看POST请求,确认请求头携带了正确的CSRF令牌,且值与Cookie一致;
- 开启Spring Boot的DEBUG日志,查看
CsrfFilter的日志输出,确认令牌是否被正确识别。
内容的提问来源于stack exchange,提问作者NAVOZ
相关产品推荐
相关产品推荐

