Spring Security中AuthorizationAdvisorProxyFactory的线程安全问题分析与解决方案
问题背景
在Spring Security 6.4.4版本中,当使用@AuthorizeReturnObject
注解的端点返回一个包含@PreAuthorize
授权对象的对象时,如果同时有多个并行请求访问该端点,系统会抛出ConcurrentModificationException
异常。这个问题主要出现在授权代理工厂对授权顾问列表进行排序时。
问题根源分析
该问题的根本原因在于AuthorizationAdvisorProxyFactory
类中的排序操作不是线程安全的。具体来说,当多个线程同时调用proxy
方法时,它们会共享同一个顾问列表,而AnnotationAwareOrderComparator.sort
方法会对这个列表进行排序操作,导致并发修改异常。
在Spring Security 6.3.2版本中,这个排序操作不会引发问题,但在6.4.4版本中,由于内部实现的改变,排序操作变得更加严格,会检查并发修改情况。
技术细节
问题的核心在于ArrayList
的sort
方法实现。即使排序操作实际上不需要修改列表内容,ArrayList.sort
方法也会首先检查是否有并发修改。这种检查在并发场景下会导致问题,因为多个线程可能同时尝试对同一个列表进行排序操作。
临时解决方案
在等待官方修复的同时,可以采用以下线程安全的代理工厂实现作为临时解决方案:
@Component
@Primary
public class ThreadsafeAuthorizationProxyFactory implements AuthorizationProxyFactory {
private AuthorizationAdvisorProxyFactory delegate;
private final ReentrantLock lock = new ReentrantLock();
@Override
public Object proxy(Object object) {
try {
this.lock.lock();
return this.delegate.proxy(object);
} finally {
this.lock.unlock();
}
}
public void setDelegate(AuthorizationAdvisorProxyFactory delegate) {
this.delegate = delegate;
}
}
同时需要配置相应的advisor:
@Bean
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
static Advisor authorizeReturnObjectAdvisor(ObjectProvider<AuthorizationAdvisor> provider,
ThreadsafeAuthorizationProxyFactory proxyFactory) {
AuthorizationAdvisorProxyFactory delegate = new AuthorizationAdvisorProxyFactory(new ArrayList<>());
provider.forEach(delegate::addAdvisor);
AuthorizeReturnObjectMethodInterceptor interceptor = new AuthorizeReturnObjectMethodInterceptor(proxyFactory);
delegate.addAdvisor(interceptor);
proxyFactory.setDelegate(delegate);
return interceptor;
}
最佳实践建议
-
在使用Spring Security的授权注解时,特别是
@AuthorizeReturnObject
和@PreAuthorize
组合使用时,要注意并发场景下的安全性。 -
对于高并发应用,建议对关键的安全组件进行线程安全评估,必要时实现自定义的线程安全包装器。
-
升级Spring Security版本时,要特别注意安全相关组件的线程安全性变化。
总结
Spring Security作为企业级安全框架,其线程安全性至关重要。这个案例展示了即使在成熟的框架中,并发问题也可能在特定场景下出现。开发者在使用高级安全特性时,应当充分理解其内部实现机制,并在必要时提供额外的线程安全保证。
官方已经确认将在下一个维护版本中修复此问题,在此之前,使用上述线程安全代理工厂是一个可靠的临时解决方案。
HunyuanImage-3.0
HunyuanImage-3.0 统一多模态理解与生成,基于自回归框架,实现文本生成图像,性能媲美或超越领先闭源模型00ops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。C++043Hunyuan3D-Part
腾讯混元3D-Part00GitCode-文心大模型-智源研究院AI应用开发大赛
GitCode&文心大模型&智源研究院强强联合,发起的AI应用开发大赛;总奖池8W,单人最高可得价值3W奖励。快来参加吧~0286Hunyuan3D-Omni
腾讯混元3D-Omni:3D版ControlNet突破多模态控制,实现高精度3D资产生成00GOT-OCR-2.0-hf
阶跃星辰StepFun推出的GOT-OCR-2.0-hf是一款强大的多语言OCR开源模型,支持从普通文档到复杂场景的文字识别。它能精准处理表格、图表、数学公式、几何图形甚至乐谱等特殊内容,输出结果可通过第三方工具渲染成多种格式。模型支持1024×1024高分辨率输入,具备多页批量处理、动态分块识别和交互式区域选择等创新功能,用户可通过坐标或颜色指定识别区域。基于Apache 2.0协议开源,提供Hugging Face演示和完整代码,适用于学术研究到工业应用的广泛场景,为OCR领域带来突破性解决方案。00- HHowToCook程序员在家做饭方法指南。Programmer's guide about how to cook at home (Chinese only).Dockerfile09
- PpathwayPathway is an open framework for high-throughput and low-latency real-time data processing.Python00
最新内容推荐
项目优选









