我在Sping Boot 3上构建了一个Java应用程序,我有一个简单的安全配置如下:
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
public class SecurityConfig {
private static final String[] permitMethods = new String[]{
"/api/games/**",
"/swagger-ui/**",
"/v3/api-docs/**",
"/actuator/**"
};
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf.disable())
.authorizeRequests(authorizeRequests ->
authorizeRequests
.requestMatchers(permitMethods).permitAll()
.anyRequest().authenticated()
)
.userDetailsService(userDetailsService())
.httpBasic(Customizer.withDefaults());
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("admin")
.password("admin")
.build();
return new CachingUserDetailsService(new InMemoryUserDetailsManager(user));
}
}
字符串
问题是当前的应用程序在执行压力测试时使用了超过70%的CPU。删除.httpBasic(Customizer.withDefaults());
时
CPU使用率下降到10%。我正在使用40个并行线程执行压力测试,我设置的并行线程越多,CPU使用率就越高。
我目前使用的是spring boot 3.1.1 version
,但我也在spring boot 3.0.0
版本上试过,但结果是一样的。
你有什么想法,我如何才能最大限度地减少CPU使用的基本身份验证?
1条答案
按热度按时间u0sqgete1#
问题很简单,高cpu的原因是在你的密码编码器中,特别是在
UserDetails user = User.withDefaultPasswordEncoder()
行,现在如果你去植入它的阶段,你可以看到它使用ByCrypt算法来编码密码,ByCrypt对CPU来说是昂贵的,因为它在许多迭代中进行哈希,你可以检查how bycrypt works以了解更多关于它是如何工作的。您可以通过执行以下操作来验证问题是bycrpt而不是httbasic:
定义bean密码编码器:
字符串
在这里尝试使用纯文本密码!
也供注册用户使用
型
”现在你知道这个问题,你能做什么?**你可以改变一些bycrypt的功能,当你定义
BCryptPasswordEncoder
为bean(检查构造函数)时,这些功能是可用的。如下图所示:型
或您可以使用更快的哈希算法来实现Spring安全性,您可以检查
PasswordEncoder
接口的实现类你也可以检查一些其他相关的问题,可能会帮助你更像:this或this