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
相关产品推荐
相关产品推荐

