目录
- 1. 导入依赖
- 2. 配置 PasswordEncoder
- 3. 使用 PasswordEncoder 加密用户密码
- 4. 使用 PasswordEncoder 验证用户密码
1. 导入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
2. 配置 PasswordEncoder
在配置类中创建一个 PasswordEncoder 对象,并注入到 Spring 容器中。
@Configuration
public class SecurityConfig {@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();// 加密方式}
}
3. 使用 PasswordEncoder 加密用户密码
写一个Service 类,注入 PasswordEncoder 对象,在注册用户时对密码进行加密。
@Service
public class ResUserBizImpl implements ResUserBiz{@Autowiredprivate ResUserMapper resUserMapper;// 注入加密器@Autowiredprivate PasswordEncoder passwordEncoder;@Overridepublic int register(ResUserVO user) {//需要先查询是否已经存在相同用户名// 创建条件构造器QueryWrapper<Resuser> queryWrapper = new QueryWrapper<>();// 添加条件:用户名queryWrapper.eq("username", user.getUsername());if (resUserMapper.selectOne(queryWrapper) != null) {// 已经存在相同用户名throw new RuntimeException("用户名"+user.getUsername()+"已存在");}Resuser resuser = new Resuser();resuser.setUsername(user.getUsername());// 对密码进行加密String encodedPassword = passwordEncoder.encode(user.getPwd());System.out.println("加密后的密码为:"+encodedPassword);resuser.setPwd(encodedPassword);resuser.setEmail(user.getEmail());resUserMapper.insert(resuser);return resuser.getUserid();}
}
测试加密情况:
可能出现的问题:
我在测试的时候报了MysglDataTruncation
错误,提示Data truncation: Data too long for column 'pwd' at row 1
(如下图),提示了密码长度过长。
这是因为 数据库中 pwd 字段长度为 50,而BCryptPasswordEncoder生成的加密密码长度通常为 60 个字符的字符串,所以出现了长度过长的错误。
解决:修改数据库字段长度。
ALTER TABLE your_table MODIFY COLUMN pwd VARCHAR(255);
4. 使用 PasswordEncoder 验证用户密码
在登录时,使用 PasswordEncoder 的matches("明文", "密文")
对比用户输入的密码和数据库中存储的加密后的密码是否匹配。
@Overridepublic Resuser searchUser(ResUserVO user) {QueryWrapper<Resuser> queryWrapper = new QueryWrapper<>();queryWrapper.eq("username",user.getUsername());String pwd = user.getPwd();Resuser resuser = resUserMapper.selectOne(queryWrapper);if (resuser != null){//使用matches方法比较明文和加密后的密码是否匹配if (passwordEncoder.matches(pwd,resuser.getPwd()))return resuser;}return null;}
参考链接:
spring security 官方文档:https://docs.spring.io/spring-security/reference/index.html
spring security 中文文档:https://springdoc.cn/spring-security/index.html
参考博客:https://blog.csdn.net/m0_71273766/article/details/132942056?spm=1001.2014.3001.5501