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

使用AadResourceServerHttpSecurityConfigurer时AccessDeniedHandler未被调用的问题咨询

解决方案

可以在使用AadResourceServerHttpSecurityConfigurer.aadResourceServer()的同时让两个异常处理器生效,问题出在你当前的配置方式上——全局的exceptionHandling配置会被AadResourceServerHttpSecurityConfigurer内部的默认配置覆盖,导致自定义的accessDeniedHandler无法触发格式错误令牌的处理逻辑。

正确的做法是直接在AadResourceServerHttpSecurityConfigurer的配置块中指定异常处理器,而非通过全局的exceptionHandling设置,具体修改如下:

@Autowired
private ErrorHandler errorHandler;

@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
        .csrf(csrf -> csrf.disable())
        .with(AadResourceServerHttpSecurityConfigurer.aadResourceServer(), configurer -> {
            // 直接在Aad资源服务器配置中指定异常处理器
            configurer.authenticationEntryPoint(errorHandler);
            configurer.accessDeniedHandler(errorHandler);
        })
        .authorizeHttpRequests(requests -> requests
            .requestMatchers(antMatcher("/users/**")).permitAll()
            .requestMatchers(antMatcher(HttpMethod.GET, "/admin")).hasRole(ADMIN_ROLE)    
            .anyRequest().authenticated()
        )
        .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS));

    return http.build();
}

原理说明

AadResourceServerHttpSecurityConfigurer是Spring Cloud Azure对原生oauth2ResourceServer的封装,它内部默认配置了适配Azure AD的认证逻辑(包括异常处理)。如果你在全局exceptionHandling中设置处理器,会被Aad配置器的默认设置覆盖;而直接在Aad配置块中指定处理器,会替换它的默认异常处理逻辑,和你使用原生oauth2ResourceServer的配置逻辑保持一致,从而实现格式错误令牌、无令牌、权限不足等场景下的自定义错误返回。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 09:20:21