我正在学习Spring Security,我创建了一个简单的RestController,其中包含一种从数据库检索数据的方法。
之后,我在pom.xml中添加了Spring Security依赖项。 Spring为我创建了一个用户名和密码。现在,如果要从数据库中检索数据,则需要使用此用户名和密码。
之后,我想添加BCryptPasswordEncoder,然后将这段代码添加到SpringBootApplication主类中:
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
现在,如果我尝试使用Spring创建的用户名和密码登录,它将无法正常工作。我想知道是否仅添加此代码就能对Spring后台创建的默认密码进行编码?为什么当我尝试使用该密码登录时Spring不再对我的密码进行编码?登录时应添加什么代码对密码进行编码?谢谢!
答案 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,以便可以修改UserDetailsService返回的内容。因为它有缓存事物的习惯。
该示例项目可用online