如何进行加密。这样在数据库中就不会显示用户密码。我现在保存在数据库中 - 登录名和密码,用户角色。我需要密码必须加密(BCrypt) 在数据库中
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasRole("USER")
.antMatchers("/**").permitAll()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/allStudents")
.and()
.logout()
.and()
.csrf().disable();
}
@Bean
public PasswordEncoder weDoNotWantEncryption() {
return new PasswordEncoder() {
@Override
public String encode(CharSequence rawPassword) {
return rawPassword.toString();
}
@Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
return rawPassword.toString().equals(encodedPassword);
}
};
}
}
非常简单 - 只需将您的
weDoNotWantEncryption()
函数替换为返回 BCrypt 实例的函数即可:
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
BCryptPasswordEncoder
实现了 PasswordEncoder
(顾名思义),因此已经为 encode()
和 matches()
定义了好的方法。
请注意,这(当然)会使数据库中当前的任何密码变得不可用,尽管考虑到这些密码以明文形式存储,我假设(并希望/祈祷)这是在测试环境中,而不是生产环境中。
当我们加密存储密码时,我们通常会对它们进行哈希处理,使其成为一种单向加密,即即使我们知道哈希算法,我们也无法从加密密码中检索原始密码。
我们执行此操作的主要程序如下。
现在验证用户登录:
使用 Bcrypt 执行此操作是一个简单的过程,因为大部分工作都是由库处理的。我解释了上述场景,以便您更好地了解幕后发生的事情。您执行以下操作来生成并保存散列密码。
String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt());
现在您已经有了哈希字符串,请将其存储到数据库中。
当用户登录时,您会获取他输入的密码、数据库存储的哈希字符串,并对其进行验证。
if (BCrypt.checkpw(entered_pw, stored_hash))
return True;
请参阅此处有关 BCrypt 哈希的 Spring Security 文档: