目录
- [1. 导入依赖](#1. 导入依赖)
- [2. 配置 PasswordEncoder](#2. 配置 PasswordEncoder)
- [3. 使用 PasswordEncoder 加密用户密码](#3. 使用 PasswordEncoder 加密用户密码)
- [4. 使用 PasswordEncoder 验证用户密码](#4. 使用 PasswordEncoder 验证用户密码)
1. 导入依赖
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2. 配置 PasswordEncoder
在配置类中创建一个 PasswordEncoder 对象,并注入到 Spring 容器中。
java
@Configuration
public class SecurityConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();// 加密方式
}
}
3. 使用 PasswordEncoder 加密用户密码
写一个Service 类,注入 PasswordEncoder 对象,在注册用户时对密码进行加密。
java
@Service
public class ResUserBizImpl implements ResUserBiz{
@Autowired
private ResUserMapper resUserMapper;
// 注入加密器
@Autowired
private PasswordEncoder passwordEncoder;
@Override
public 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 个字符的字符串,所以出现了长度过长的错误。
解决:修改数据库字段长度。
sql
ALTER TABLE your_table MODIFY COLUMN pwd VARCHAR(255);
4. 使用 PasswordEncoder 验证用户密码
在登录时,使用 PasswordEncoder 的matches("明文", "密文")
对比用户输入的密码和数据库中存储的加密后的密码是否匹配。
java
@Override
public 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