Следуя актуальному руководству здесь и добавив кодировщик паролей BCrypt на основе Пример Baeldung здесь Я настроил приложение Spring Boot для использования базы данных (настраивается отдельно, а не автоматически). генерируется ORM или чем-то еще) в качестве источника пользовательских данных для аутентификации. Эта часть моей конфигурации безопасности ( здесь ) выглядит следующим образом:
@Override
public void configure(AuthenticationManagerBuilder builder) throws Exception {
builder .jdbcAuthentication()
.dataSource(dataSource)
.withUser(User.withUsername("admin").password(passwordEncoder().encode("pass")).roles("SUPER"));
logger.debug("Configured app to use JDBC authentication with default database.");
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
При первом запуске это работает, создавая пользователя с именем «admin» с хешированным паролем и указаннымроль в базе данных. (Это база данных PostgreSQL, которая того стоит.) Однако, если я попытаюсь снова запустить приложение, оно не запустится, аварийно завершится, потому что попыталось создать того же пользователя снова и получило повторяющуюся ошибку первичного ключа.
Что бы я хотел: Я бы хотел, чтобы Spring Boot создал пользователя по умолчанию , если он еще не существует , пропустите его, если он уже существует.
Почему: Необходимо иметь возможность войти во вновь инициализированную копию приложения, иногда перезапуская его несколько раз, для тестирования и экспериментов на компьютере разработчика. Моя «производственная» база данных уже должна иметь учетную запись «admin», и приложение не должно перезаписывать ее или вызывать сбой, потому что не может.
Поэтому мой вопрос: Как я могу инициализироватьпользователь по умолчанию в конфигурации jdbcAuthentication
Spring Boot таким образом, чтобы Spring Boot не падал, если имя пользователя уже существует?
В качестве альтернативы : если бы я мог INSERT
пользователь по умолчаниюв базу данных с SQL, когда база данных раскручивается, мне не нужно было бы делать это в конфигурации Spring Boot. Но я не знаю, как хэшировать пароль в операторе INSERT
таким образом, чтобы он соответствовал хэшированию Spring Boot.
PS: у меня есть другая проблема с моей новой конфигурацией, которая нарушает некоторые классы автоматического тестирования (см. другой вопрос если интересно).