Как ускорить базовую аутентификацию SpringBoot 2.0? - PullRequest
0 голосов
/ 27 августа 2018

Я недавно обновил приложение Spring Boot с версии 1.5 до версии 2.0.3. Это приложение с методами, предоставляемыми как конечные точки REST и защищенными базовой HTTP-аутентификацией. Имена пользователей и пароли жестко закодированы в файле свойств, загруженном приложением.

После обновления время отклика увеличилось почти на 200 мс, и 98% времени обработки запроса тратится в BasicAuthenticationFilter.doFilter ().

new relic transaction details

В частности, время, затрачиваемое на кодирование пароля в запросе, сравнивается с паролем, указанным в конфигурации.

visualvm details

Вот выдержка из класса SecurityConfig:

@EnableWebSecurity
@PropertySource("classpath:auth/auth.properties")
public class SecurityConfig extends WebSecurityConfigurerAdapter {

     @Value("${user.name}")
     private String userName;
     @Value("${user.password}")
     private String userPassword;
     @Value("${user.roles}")
     private String[] userRoles;

     @Override
     protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
        PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
        UserDetails user = User.withUsername(userName).password(encoder.encode(userPassword)).roles(userRoles).build();
        auth.inMemoryAuthentication().withUser(user);
    }

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        //make sure that the basic authentication header is always required
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

        //set the correct authentication entry point to make sure the 401 response is in JSON format
        http.exceptionHandling().authenticationEntryPoint(new AuthenticationEntryPoint());

        //enable http basic authentication
        http.httpBasic();

        //make sure authentication is required for all requests except /actuator/info
        http.authorizeRequests().antMatchers("/actuator/info").permitAll().anyRequest().authenticated();
        http.authorizeRequests().antMatchers("/actuator/**").hasAnyRole("MONITOR", "ACTUATOR");

        //disable the form login since this is a REST API
        http.formLogin().disable();

        //disable csrf since this is a REST API
        http.csrf().disable();
    }
}

Чтобы убедиться, что это произошло из-за обновления Spring Boot, я локально отменил изменения и провел несколько тестов. Время отклика было разделено на 4.

Я уже пробовал несколько вещей, но ни одна из них не улучшила время отклика:

Могу ли я сделать что-нибудь для ускорения фильтра аутентификации?

1 Ответ

0 голосов
/ 28 августа 2018

Действительно, одним из решений является использование другого кодировщика паролей, например, в классе SecurityConfig:

@Override
protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService())
        .passwordEncoder(passwordEncoder());
}

@Bean
public UserDetailsService userDetailsService() {
    PasswordEncoder encoder = passwordEncoder();
    InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
    UserDetails user = User.withUsername(userName).password(encoder.encode(password)).roles(userRoles).build();
    manager.createUser(user);
    return manager;
}

private PasswordEncoder passwordEncoder() {
    // return a fast password encoder
}

Теперь, какой алгоритм шифрования использовать - это другой вопрос. Несмотря на то, что bcrypt кажется безопасным вариантом, мне интересно, если это необходимо, учитывая, что пароль хранится в памяти и, следовательно, труднодоступен.

Смотрите также

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...