用户密码加密存储

HeJin大约 1 分钟Spring全家桶SpringSecurity认证授权

SpringSecurity配置类配置PasswordEncoder

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

}

测试PasswordEncoder

@Autowired
private PasswordEncoder passwordEncoder;

@Test
void test1() {
    // 加密
    String encode = passwordEncoder.encode("123456789");
    String encode2 = passwordEncoder.encode("123456789");
    System.out.println(encode);
    System.out.println(encode2);

    // 密码校验
    boolean matches = passwordEncoder.matches("123456789", "$2a$10$YzMd4CELnRUDNOs9HQJdR.KA2X5YnC5aOHQ4zCzjRVvGv5oOppEJW");
    boolean matches1 = passwordEncoder.matches("123456789", "123456789");
    System.out.println(matches);
    System.out.println(matches1);
}

结果:

$2a$10$xEnP5Omtl9JEk8xUm4Qp7ONjKxcmwMjcgp/FAdo/KYj5IbZmF6agm
$2a$10$rr62fnSnQEURKuCVIO9KbuV8g3fQnbIQ6CJMwNxFLIQ2emec8slV2
2022-03-27 17:46:05.856  WARN 4316 --- [           main] o.s.s.c.bcrypt.BCryptPasswordEncoder     : Encoded password does not look like BCrypt
true
false

再次测试登录

此时报错信息是用户名或者密码错误。我们自己也在UserDetailsServiceImpl抛出了一个异常用户名或者密码错误,这里是用户查询不到的时候抛出的。但是输入的用户名admin在数据库中是存在的,所以这个异常是SpringSecurity内部自己的异常(可以把异常信息改之后再测试,发现的确是这样),是PasswordEncoder比对密码的时候跑出的。

此时我们已经配置了PasswordEncoder,但是数据库中还是存储之前的明文密码。PasswordEncoder在调用matches方法进行校验的时候,密码对不上,所以报错。

修改数据库中的密码为加密之后的:

再次访问登录页面,登录成功。