Эта ошибка означает, что сохраненный пароль не имеет префикс типа пароля.
Например, ваши хешированные пароли могут выглядеть примерно так:
$2a$10$betZ1XaM8rTUQHwWS.cyIeTKJySBfZsmC3AYxYjwa4fHtr6i/.9oG
Но Spring Security теперь ожидает:
{bcrypt}$2a$10$betZ1XaM8rTUQHwWS.cyIeTKJySBfZsmC3AYxYjwa4fHtr6i/.9oG
У вас в основном дваварианты .Во-первых, настройте DelegatingPasswordEncoder
на то, что должно быть по умолчанию:
@Bean
public PasswordEncoder passwordEncoder() {
String idForEncode = "bcrypt";
BCryptPasswordEncoder bcrypt = new BCryptPasswordEncoder();
Map<String, PasswordEncoder> encoderMap =
Collections.singletonMap(idForEncode, bcrypt);
DelegatingPasswordEncoder delegating =
new DelegatingPasswordEncoder(idForEncode, encoderMap);
delegating.setDefaultPasswordEncoderForMatches(bcrypt);
return delegating;
}
Или, во-вторых, выполните пакетное обновление вашего хранилища паролей (с префиксом {bcrypt}
).
Я не уверен, откуда твой ClientDetailsService
тянет, но я бы начал искать там.
ОБНОВЛЕНИЕ : Тем не менее, предполагается, что ваши существующие пароли зашифрованы.Если это не так, то вы должны указать любой кодер:
@Bean
public PasswordEncoder passwordEncoder() {
String idForEncode = "bcrypt";
PasswordEncoder existing = new MyPasswordEncoder();
PasswordEncoder updated = new BCryptPasswordEncoder();
Map<String, PasswordEncoder> encoderMap =
Collections.singletonMap(idForEncode, updated);
DelegatingPasswordEncoder delegating =
new DelegatingPasswordEncoder(idForEncode, encoderMap);
delegating.setDefaultPasswordEncoderForMatches(existing);
return delegating;
}