You need to enable JavaScript to run this app. Angular+Spring Boot集成Azure AD实现SSO遇到403错误如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

Angular+Spring Boot集成Azure AD实现SSO遇到403错误如何解决?

问题排查与修复方案

1. 接口路径与安全规则不匹配

你当前Spring Security配置仅对/api/**路径下的接口触发身份认证,但是@PreAuthorize注解修饰的/hello、saveSOList接口都没有/api前缀,请求到达接口时未经过身份认证流程,Security上下文没有用户权限信息,直接触发方法级权限校验就会返回403。
修复方案二选一:

  • 给所有需要鉴权的接口加上/api前缀
  • 修改Security的认证规则,匹配实际接口路径:
http.cors().and().authorizeRequests()
        .antMatchers("/index", "/").permitAll()
        // 新增需要认证的接口路径匹配
        .antMatchers("/hello", SO_URI + SAVE_SO_LIST).authenticated()
        .antMatchers("/api/**").authenticated()
        .anyRequest().permitAll()

2. 角色校验前缀不匹配

Spring Security的hasRole()方法默认会自动给参数加上ROLE_前缀再做匹配,而Azure AD默认返回的组权限不带此前缀,所以你写hasRole('PDP')实际会去匹配ROLE_PDP,自然匹配失败。
修复方案二选一:

  • 将hasRole('PDP')替换为hasAuthority('PDP')
  • 配置Azure AD权限转换时自动添加ROLE_前缀,修改yml配置:
azure:
  activedirectory:
    user-group:
      allowed-groups: PDP
    # 新增角色前缀配置
    role-prefix: ROLE_

3. 前端令牌拦截规则配置错误

你当前Angular的protectedResourceMap仅配置了http://localhost:8080/,只能匹配根路径请求,子路径比如/hello不会触发拦截器自动添加Authorization头,后端拿不到访问令牌自然鉴权失败。
修复方案,修改前端拦截配置:

protectedResourceMap.set('http://localhost:8080/**', ['api://xxxxx-xxxxxx-xxx--xxxxxxxxxx/login']);

4. 代码拼写错误

你的LoginController里@Autowirednsta是明显的拼写错误,修改为@Autowired,避免Spring上下文加载异常。

5. 其他需确认项

  • 确认Azure AD应用注册的令牌配置里已经开启了groups声明发放,否则后端拿不到用户所属的组信息,权限校验也会失败
  • 确认前端请求的scope已经被后端应用的API权限列表包含,且管理员已经同意授权
  • POST请求需要携带后端返回的CSRF令牌,确认请求头里包含X-XSRF-TOKEN字段
  • 你当前架构是前端MSAL独立完成身份认证,后端仅做令牌校验,所以后端配置里的redirect-uri-template是后端作为OAuth客户端发起认证时用的,当前场景用不到,可以删掉避免混淆

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 09:54:07