自定义AuthorizationManager<MethodInvocation>的check方法未触发排查请求
问题排查与解决方案
以下是导致自定义AuthorizationManager的check方法未触发的常见原因及对应解决办法:
1. 切入点正则未匹配目标方法
JdkRegexpMethodPointcut的pattern匹配的是方法的全限定名(包名+类名+方法名),你设置的"xxx.*"仅能匹配以xxx开头的方法名,但如果目标方法的全限定名是类似com.example.service.UserService.xxxQuery,这个正则无法匹配。
解决:调整正则表达式为准确匹配,比如要匹配com.example.service包下所有类中以xxx开头的方法,可设置:
pattern.setPattern("com.example.service.*.xxx.*");
2. 未开启方法级安全支持
必须在Spring配置类上添加注解开启方法安全,否则方法拦截器不会生效:
- Spring Security 5.6+ 使用
@EnableMethodSecurity - 旧版本使用
@EnableGlobalMethodSecurity(prePostEnabled = true)
示例配置类:
@Configuration @EnableMethodSecurity public class SecurityConfig { // 你的自定义Advisor Bean等配置 }
3. 确认Advisor Bean是否被正确加载
虽然你标注了@Role(BeanDefinition.ROLE_INFRASTRUCTURE),但可通过以下方式验证Bean是否注册:
- 启动日志中搜索
customAuthorizeBean是否被初始化 - 调试时查看
MethodSecurityInterceptor的拦截器链中是否包含你的AuthorizationManagerBeforeMethodInterceptor
4. 拦截器顺序冲突(可能性较低)
你设置的interceptor.setOrder(AuthorizationInterceptorsOrder.PRE_AUTHORIZE.getOrder() - 1)优先级高于@PreAuthorize,但如果目标方法上同时存在其他方法安全注解,且对应的拦截器提前终止了拦截链,可能导致你的自定义拦截器未执行。可尝试暂时移除其他方法安全注解,单独测试自定义拦截器是否生效。
内容的提问来源于stack exchange,提问作者Ole K
相关产品推荐
相关产品推荐

