【发布时间】:2018-12-14 22:42:55
【问题描述】:
我目前正在尝试学习 Spring 安全性。我使用 BCryptPasswordEncoder 在持久化到数据库之前对用户密码进行编码
代码:
@Override
public void saveUser(User user) {
user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
user.setActive(1);
Role userRole = roleRepository.findByRole("ADMIN");
user.setRoles(new HashSet<Role>(Arrays.asList(userRole)));
userRepository.save(user);
}
然后在身份验证期间也使用它,并且用户按预期获得了身份验证。
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
auth.
jdbcAuthentication()
.usersByUsernameQuery(usersQuery)
.authoritiesByUsernameQuery(rolesQuery)
.dataSource(dataSource).passwordEncoder(bCryptPasswordEncoder);
}
然后我从configure() 方法中删除了.passwordEncoder(bCryptPasswordEncoder);,仍然具有编码密码的用户成功通过身份验证。
然后我从saveUser() 和configure() 方法中删除了密码编码器,并将User 持久化到数据库中(即没有密码编码)并尝试访问经过身份验证的页面,但我得到了AccessedDeniedException,
但是,即使我从 configure() 方法中删除了 passwordEncoder(),具有编码密码的用户仍然可以通过身份验证。为什么会这样?
Spring Security 在身份验证期间是否默认使用密码编码器?
如果是这样如何在没有密码编码的情况下使用spring security?
【问题讨论】:
-
你创建了 BCryptPasswordEncoder bean 吗?
-
@efex09 是的,它与编码密码完美配合,但如果我不使用密码编码,则身份验证失败
-
为什么我的问题被否决了?
-
不幸的是,许多投反对票的人懒得解释为什么他们认为这个问题不好。我们可能永远不会知道。
-
默认启用哪个。实际上,它具有更好的安全性方案,因为您可以在密码中指定要使用的编码(我相信它默认为 Bcrypt)。因此,如果您有一个纯密码前缀
{noop}<the-password>,它将使用纯编码器。使用{bcrypt}作为 crypt 的前缀(这也是默认值)。见docs.spring.io/spring-security/site/docs/current/reference/…
标签: java spring spring-boot spring-security spring-data-jpa