08 SpringSecurity-密码加密

215 阅读1分钟

「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。

 文章配套代码:gitee.com/lookouttheb…

一、SpringSecurity加密机制

Spring Security内置了密码加密机制,只需使用一个PasswordEncoder接口即可

public interface PasswordEncoder {
    String encode(CharSequence rawPassword);

    boolean matches(CharSequence rawPassword, String encodedPassword);

    default boolean upgradeEncoding(String encodedPassword) {
        return false;
    }
}

PasswordEncoder接口定义了encode和matches两个方法,当用数据库存储用户密码时,加密过程用 encode方法,matches方法用于判断用户登录时输入的密码是否正确。

此外,SpringSecurity还内置了几种常用的PasswordEncoder接口实现类,例如,StandardPasswordEncoder中的常规摘要算法(SHA-256等)、BCryptPasswordEncoder加密,以及类似 BCrypt的慢散列加密Pbkdf2PasswordEncoder等,官方推荐使用BCryptPasswordEncoder。

我们这里使用官方推荐的BCryptPasswordEncoder。

二、注入BCryptPasswordEncoder

/**
 * @author LookOutTheBush
 */
@Configuration
public class PasswordEncoderConfig {
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder(12);
    }
}

三、创建用户时加密

@Service
public class UserServiceImpl implements UserDetailsService {
    @Resource
    private UserDao userDao;
    @Resource
    private PasswordEncoder passwordEncoder;

    public UsersDO createUser(UsersDO usersDO){
        //参数校验 todo
        usersDO.setPassword(passwordEncoder.encode(usersDO.getPassword()));
        usersDO.setEnable(true);
        return userDao.createUser(usersDO);
    }
}

四、登录时密码校验

这部分SpringSecurity会使用我们暴露的加密方式来校验密码,不需要我们操作。

五、测试

1.直接生成加密后的密码。

    public static void main(String[] args) {
        BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(12);
        String encode = bCryptPasswordEncoder.encode("123");
        System.out.println(encode);
    }

2.然后手动添加到数据库中

3.启动项目测试:

 输入账号密码,登录成功。

六、总结

密码加密总的来说,需要我们做的就是暴露一个PasswordEncoder,然后我们在创建用户的时候将密码加密;剩下的SpringSecurity都给我们做好了,它会使用我们暴露的PasswordEncoder来进行密码的校验。