PasswordEncoder 接口是用来加密的,这个接口提供了俩个方法:

String encode(CharSequence var1);     加密方法,返回加密后的密码。
boolean matches(CharSequence var1, String var2);   密码验证,返回密码是否一致。第一个参数是明文密码,第二个参数是加密后的密码(数据库取)

PasswordEncoder 是一个接口,而Security中我们要使用这个接口的实现类BCryptPasswordEncoder来实现密码加密和验证操作

使用BCryptPasswordEncoder进行密码加密和密码验证的流程:

1.注册用户时,使用encode方法,即SHA-256+随机盐+密钥把用户输入的密码进行hash处理,得到密码的hash值,然后将其存入数据库中。

2.用户登录时,使用matches方法进行验证。注册的密码并不会进行密码解密(因为密码经过Hash处理,是不可逆的),而是使用相同的算法把用户输入的密码进行hash处理,得到密码的hash值,然后将其与从数据库中查询到的密码hash值进行比较。如果两者相同,说明用户输入的密码正确。

使用BCryptPasswordEncoder实现密码加密和验证:

1.自定义声明BCryptPasswordEncoder类的Bean,该类是PasswordEncoder接口的实现类。

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

2.使用encode方法加密密码,做保存。

 String encodePassword = passwordEncoder.encode(umsAdmin.getPassword());
        umsAdmin.setPassword(encodePassword);
        adminMapper.insert(umsAdmin);

3.登录校验时使用matches方法校验密码是否正确。

 UserDetails userDetails = loadUserByUsername(username);//数据库中存储的密码
                            
   if(!passwordEncoder.matches(password,userDetails.getPassword())){
    throw new BadCredentialsException("密码不正确");
 }

 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐