Как инициализировать конфигурацию безопасности Spring Boot с именем пользователя / паролем по умолчанию, но не сбой при втором запуске? - PullRequest
0 голосов
/ 28 октября 2019

Следуя актуальному руководству здесь и добавив кодировщик паролей 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: у меня есть другая проблема с моей новой конфигурацией, которая нарушает некоторые классы автоматического тестирования (см. другой вопрос если интересно).

1 Ответ

1 голос
/ 28 октября 2019

Вы можете использовать альтернативное решение, которое вы подумали, используя опцию .withDefaultSchema() с используемой вами аутентификацией jdbcauthentication. Как вы упомянули в этой альтернативе, вам, возможно, придется выяснить способ использования хешированного пароля в этом сценарии.

Если у вас возникнут дополнительные вопросы, вам поможет этот пост в блоге baeldung.

https://www.baeldung.com/spring-security-jdbc-authentication

Надеюсь, это поможет.

...