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

