BCryptPasswordEncoder会自动对Spring Security创建的默认密码进行编码吗?

时间:2019-01-09 17:43:09

标签: spring-boot spring-security bcrypt restful-authentication

我正在学习Spring Security,我创建了一个简单的RestController,其中包含一种从数据库检索数据的方法。

之后,我在pom.xml中添加了Spring Security依赖项。 Spring为我创建了一个用户名和密码。现在,如果要从数据库中检索数据,则需要使用此用户名和密码。

之后,我想添加BCryptPasswordEncoder,然后将这段代码添加到SpringBootApplication主类中:

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

现在,如果我尝试使用Spring创建的用户名和密码登录,它将无法正常工作。我想知道是否仅添加此代码就能对Spring后台创建的默认密码进行编码?为什么当我尝试使用该密码登录时Spring不再对我的密码进行编码?登录时应添加什么代码对密码进行编码?谢谢!

1 个答案:

答案 0 :(得分:0)

在不知道您正在使用哪个版本的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"))格式发送

我使用了spybean,以便可以修改UserDetailsS​​ervice返回的内容。因为它有缓存事物的习惯。

该示例项目可用online