Spring Security 6中自定义AuthorizationManager未生效求助
问题原因分析
- 缺少触发注解:自定义的
AuthorizationManagerBeforeMethodInterceptor默认仅拦截带有@PreAuthorize注解的方法,而你的MyQueryResolver方法未标注该注解,因此不会触发check方法。 - GraphQL Bean代理问题:GraphQL Resolver Bean可能未被Spring AOP正确代理,导致方法安全拦截器无法生效。
解决方案
方案1:添加@PreAuthorize注解(快速生效)
给MyQueryResolver的所有方法添加@PreAuthorize注解,触发拦截器逻辑:
@Component public class MyQueryResolver implements GraphQLQueryResolver { @PreAuthorize("permitAll") // 注解内容仅作为触发标识,实际授权逻辑由自定义manager处理 public String hello1() { return "Hello1, GraphQL!"; } @PreAuthorize("permitAll") public String hello2() { return "Hello2, GraphQL!"; } }
方案2:全局拦截(无需逐个加注解)
如果想对MyQueryResolver的所有方法自动应用授权,无需逐个添加注解,可以通过配置MethodSecurityMetadataSource指定全局规则:
- 修改
MethodSecurityConfiguration,注册全局元数据源和拦截器:
@Configuration @EnableMethodSecurity(proxyTargetClass = true) // 强制使用CGLIB代理,适配GraphQL Bean public class MethodSecurityConfiguration { @Bean @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public Advisor preAuthorizeAdvisor(CustomAuthorizationManager manager, MethodSecurityMetadataSource metadataSource) { AuthorizationManagerBeforeMethodInterceptor interceptor = AuthorizationManagerBeforeMethodInterceptor.preAuthorize(manager); interceptor.setMethodSecurityMetadataSource(metadataSource); return interceptor; } @Bean public MethodSecurityMetadataSource customMetadataSource() { MapBasedMethodSecurityMetadataSource metadataSource = new MapBasedMethodSecurityMetadataSource(); // 配置MyQueryResolver的所有方法都需要PreAuthorize授权 metadataSource.addSecureMethod(MyQueryResolver.class.getMethods(), "permitAll"); return metadataSource; } }
- 保留
CustomAuthorizationManager的原有逻辑,可根据业务需求修改check方法中的授权判断逻辑。
额外注意事项
- 确认Spring Security 6依赖版本与项目其他组件匹配,避免版本冲突。
- 若使用Spring GraphQL,需确保
@GraphQLQueryResolver标注的Bean被Spring正确扫描并管理。
内容的提问来源于stack exchange,提问作者Korki Korkig
相关产品推荐
相关产品推荐

