Не зная, какую версию 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. Так как у него есть привычка кешировать вещи.
Пример проекта доступен онлайн