SpringSecurity使用PasswordEncoder加密用户密码的示例代码
作者:睆小白
PasswordEncoder是Spring Security库中的一个关键组件,它主要用于处理密码的安全存储和验证,本文将给大家介绍一下SpringSecurity使用PasswordEncoder加密用户密码的方法,需要的朋友可以参考下
1. 导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
2. 配置 PasswordEncoder
在配置类中创建一个 PasswordEncoder 对象,并注入到 Spring 容器中。
@Configuration public class SecurityConfig { @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder();// 加密方式 } }
3. 使用 PasswordEncoder 加密用户密码
写一个Service 类,注入 PasswordEncoder 对象,在注册用户时对密码进行加密。
@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 个字符的字符串,所以出现了长度过长的错误。
解决:修改数据库字段长度。
ALTER TABLE your_table MODIFY COLUMN pwd VARCHAR(255);
4. 使用 PasswordEncoder 验证用户密码
在登录时,使用 PasswordEncoder 的matches("明文", "密文")
对比用户输入的密码和数据库中存储的加密后的密码是否匹配。
@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; }
到此这篇关于SpringSecurity使用PasswordEncoder加密用户密码的示例代码的文章就介绍到这了,更多相关SpringSecurity PasswordEncoder加密密码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!