我目前正在尝试学习 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
,
但是即使我删除了 passwordEncoder(),具有编码密码的用户仍然会通过身份验证
来自 configure()
方法。为什么会这样?
spring security在认证时默认使用密码编码器吗?
如果是这样,如何在没有密码编码的情况下使用 spring security?
最佳答案
也许你可以实现这个简单的代码来规避Spring Encoder
public class PasswordEnconderTest implements PasswordEncoder {
@Override
public String encode(CharSequence charSequence) {
return charSequence.toString();
}
@Override
public boolean matches(CharSequence charSequence, String s) {
return charSequence.toString().equals(s);
}
}
并在您的 WebSecurityConfig 中添加:
@Bean
public PasswordEncoder passwordEncoder(){
return new PasswordEnconderTest();
}
不推荐,但你可以实现
关于java - 如何在没有密码编码的情况下使用Spring Security?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51208425/