gpt4 book ai didi

java - 将 Spring Security 与线程池结合使用会导致重用线程时出现竞争条件

转载 作者:行者123 更新时间:2023-11-30 06:14:16 39 4
gpt4 key购买 nike

我有一个使用 RxJava 编写的 Spring Boot 微服务。我已经使用 Spring Security 使用 JWT 样式 token 来保护它。一切工作正常,直到我使用 RxJava io 调度程序添加线程池。我注意到当线程池与 Spring Security 一起使用时会出现有线行为。当我保存数据时,userId 也会随之保存。当我以 userOne 身份登录后创建第一个对象时,它已正确创建。对于 userTwo 也同样适用。然后说我以 userThree 身份登录并创建一个新数据,该数据是根据 userOne ID 保存的,这是错误的!仅当我在从池中获取的单独线程中执行操作时,才会出现这种行为。

我的安全配置文件如下:

public SecurityConfig(ApplicationProperties applicationProperties) {
super();
this.applicationProperties = applicationProperties;
SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
}

@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.csrf().disable().headers().frameOptions().disable().and().sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests().antMatchers("/api/**")
.authenticated().antMatchers("/management/**").hasAuthority(AuthoritiesConstants.ADMIN)
.antMatchers("/swagger-resources/configuration/ui").permitAll().antMatchers("/health/**").permitAll()
.and()
.addFilterAfter(new TokenAuthenticationProcessingFilter(
new MyAuthenticationProvider(this.applicationProperties),
"/api/**", null, new SimpleUrlAuthenticationFailureHandler()), BasicAuthenticationFilter.class);
}

为了简单明了,删除了不必要的代码。不仅对于 RxJava,而且当 @Async 与 spring 创建的线程池一起使用时,也存在相同的行为。这是一种竞争条件。

原因可能是这样的。安全上下文继承给子线程。父线程从池中获取一个线程并向该线程提交任务。线程继承安全上下文。一旦任务完成,线程就会被释放回池中。假设当另一个请求到来时,先前使用的线程将被重用。我怀疑安全上下文尚未被删除,因此数据保存在旧用户的 ID 下。

这只是一个思维导图或想象。那可能吗?如果是这样,有什么解决方案可以解决这个问题。有没有办法在线程被释放回池之前清除安全上下文?如何使用 @Async 和 RxJava 调度程序实现相同的效果?

最佳答案

您是正确的,当重新使用池中的线程时,任何线程本地数据可能仍然存在于线程中。您试图通过设置全局变量来使用安全凭据,这本质上是不安全的。 J2EE 程序可以摆脱这个问题,因为线程模型......过于简单。

在事务可以跨多个线程发生的环境中,您无法使用线程本地安全凭据。

一种可以很好地与 RxJava 配合使用的方法是将凭证绑定(bind)到类上下文,并在该上下文中执行 RxJava 观察者链,关闭凭证并确保引用的局部性。您为每个用户创建一个对象,将凭据绑定(bind)到用户,然后在需要凭据的每个步骤中引用用户的凭据。

关于java - 将 Spring Security 与线程池结合使用会导致重用线程时出现竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49575487/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com