Будет ли BCryptPasswordEncoder автоматически кодировать пароль по умолчанию, созданный Spring Security? - PullRequest
0 голосов
/ 09 января 2019

Я изучаю Spring Security и создал простой RestController с методом извлечения данных из базы данных.

После этого я добавил зависимость Spring Security в pom.xml. И Spring создал для меня имя пользователя и пароль. И теперь мне нужно использовать это имя пользователя и пароль, если я хочу получить данные из базы данных.

После этого я хочу добавить BCryptPasswordEncoder и просто добавляю этот код в основной класс SpringBootApplication:

@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
    return new BCryptPasswordEncoder();
}

И теперь, если я пытаюсь войти в систему с именем пользователя и паролем, созданными Spring, это не работает. Я хочу знать, будет ли простое добавление этого кода кодировать пароль по умолчанию, созданный Spring за сценой? И почему, когда я пытаюсь войти в систему с этим паролем, Spring больше не кодирует мой пароль? Какой код я должен добавить, чтобы закодировать пароль при входе в систему? Спасибо!

1 Ответ

0 голосов
/ 10 января 2019

Не зная, какую версию Spring Security вы используете, я отвечу, что вы будете делать в Spring Security 5

@Bean
public PasswordEncoder passwordEncoder() {
    return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}

@Bean
public UserDetailsService userDetailsService() {
    return new InMemoryUserDetailsManager(
        User.builder()
            .passwordEncoder(input -> passwordEncoder().encode(input))
            .username("user")
            .password("{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG")
            .roles("USER")
            .build()
    );
}

Кодировщик паролей делегирования поддерживает множество различных форматов паролей и автоматически определяет его на основе префикса {bcrypt}.

Интеграционный тест может выглядеть следующим образом

@SpyBean
public UserDetailsService userDetailsService;

private User.UserBuilder user = User.withDefaultPasswordEncoder()
    .username("user")
    .password("password")
    .roles("USER");

@Test
@DisplayName("form login works")
void happyPath() throws Exception {
    doReturn(user.build())
        .when(userDetailsService).loadUserByUsername(any(String.class));
    mvc.perform(
        MockMvcRequestBuilders.post("/login")
            .param("username", "user")
            .param("password", "password")
    )
        .andExpect(status().is3xxRedirection())
        .andExpect(redirectedUrl("/"))
        .andExpect(authenticated())
    ;
}

Как видите, сервер хранит пароль в формате bcrypt. Клиент отправляет его открытым текстом (.param("password", "password"))

Я использовал шпион, чтобы я мог изменить то, что возвращает UserDetailsService. Так как у него есть привычка кешировать вещи.

Пример проекта доступен онлайн

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