Я полагаю, что причина в том, что это занимает 500 мс, связана с кодированием пароля.BCrypt - это механизм кодирования, разработанный для того, чтобы сделать аутентификацию более длительной, чтобы смягчить атаки методом "грубой силы".
Как правило, эта проблема производительности решается путем обмена долговременными учетными данными (например, паролями) с кратковременными, такими какжетоны. OAuth - это структура, которая пытается стандартизировать эту практику. В Spring Security 5.1 появилась поддержка защиты API с помощью OAuth 2.0 .Это не сразу решит проблему с производительностью, так как может потребовать внедрения большей инфраструктуры, но, вероятно, это лучший выбор для обеспечения безопасности в долгосрочной перспективе.
В качестве альтернативы вы можете использовать более слабый кодер или, возможно, меньшее количествораунды BCrypt, но обратите внимание, что оба они являются компромиссом между безопасностью и производительностью.Вы бы заменили свой BCryptPasswordEncoder
на что-то другое, например:
@Bean
public PasswordEncoder encoder() {
// ...
}
РЕДАКТИРОВАТЬ : Рад, что вы нашли проблему!Тангенциально, я бы порекомендовал очистить то, как вы описываете свой менеджер аутентификации.Его можно заменить на UserDetailsService
:
@Bean
@Override
public UserDetailsService userDetailsService() {
Resource confFile = resourceLoader.getResource("classpath:users.list");
Collection<UserDetails> users = ApiUtils.getUsersFromFile(confFile)
.stream().map(this::toUserDetails)
.collect(Collectors.toList());
return new InMemoryUserDetailsManager(users);
}
private UserDetails toUserDetails(ApiUser apiUser) {
UserBuilder builder = User.builder()
.username(apiUser.username)
.password(apiUser.password);
return apiUser.admin ?
builder.roles("USER", "ADMIN").build() :
builder.roles("USER").build();
}
Это хорошо, потому что он занимает меньше места в конфигурации (диспетчер аутентификации - это «больше», чем служба сведений о пользователе).Если вы просто хотите предоставить пользователям, то более типично переопределить UserDetailsService
вместо AuthenticationManager
.