spring Sping Boot 3 -basicAuth上的高CPU使用率

mbskvtky  于 2023-08-02  发布在  Spring
关注(0)|答案(1)|浏览(92)

我在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使用的基本身份验证?

u0sqgete

u0sqgete1#

问题很简单,高cpu的原因是在你的密码编码器中,特别是在UserDetails user = User.withDefaultPasswordEncoder()行,现在如果你去植入它的阶段,你可以看到它使用ByCrypt算法来编码密码,ByCrypt对CPU来说是昂贵的,因为它在许多迭代中进行哈希,你可以检查how bycrypt works以了解更多关于它是如何工作的。
您可以通过执行以下操作来验证问题是bycrpt而不是httbasic:
定义bean密码编码器:

@Bean
    public PasswordEncoder bCryptPasswordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }

字符串
在这里尝试使用纯文本密码!
也供注册用户使用

UserDetails user = User.builder()
                .username("admin")
                .password("admin")
                .build();


”现在你知道这个问题,你能做什么?**你可以改变一些bycrypt的功能,当你定义BCryptPasswordEncoder为bean(检查构造函数)时,这些功能是可用的。如下图所示:

@Bean
    public PasswordEncoder bCryptPasswordEncoder() {
        return new BCryptPasswordEncoder(strenght_number_that_suits_for_you);
    }

您可以使用更快的哈希算法来实现Spring安全性,您可以检查PasswordEncoder接口的实现类

你也可以检查一些其他相关的问题,可能会帮助你更像:thisthis

相关问题