You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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-TOKEN Cookie是否被删除或修改;
  • 确认OAM允许X-XSRF-TOKEN(或你设置的请求头)通过,没有被拦截;
  • 检查OAM是否自带CSRF防护机制,如果有,需要关闭其中一方的CSRF,或者配置两者兼容(比如让OAM信任Spring的CSRF令牌)。

最后验证步骤

  1. 浏览器Application标签页确认XSRF-TOKEN的HttpOnly属性为false;
  2. Network标签页查看POST请求,确认请求头携带了正确的CSRF令牌,且值与Cookie一致;
  3. 开启Spring Boot的DEBUG日志,查看CsrfFilter的日志输出,确认令牌是否被正确识别。

内容的提问来源于stack exchange,提问作者NAVOZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 21:28:01