SpringSecurity使用PasswordEncoder加密用户密码的示例代码
目录
- 1. 导入依赖
- 2. 配置 PasswordEncoder
- 3. 使用 PasswordEncoder 加密用户密码
- 4. 使用 PasswordEncoder 验证用户密码
1. 导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
2. 配置 PasswordEncoder
android在配置类中创建一个 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.getPwjavascriptd()); System.out.println("加密后的密码为:"+encodedPassword); resuser.setPwd(encodedPassword); resuser.setEmail(user.getEmail()); resUserMapper.insert(resuser); return resuser.getUserid(); } }
测试加密情况:
可能出现的问题:
我在测试的时候报了MysglDataTruncation
错误,提示Data truncatihttp://www.devze.comon: 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(&quowww.devze.comt;明文", "密文")
对比用户输入的密码和数据库中存储的加密后的密码是否匹配。
@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){ IPbqiQxO //使用matches方法比较明文和加密后的密码是否匹配 if (passwordEncoder.matches(pwd,resuser.getPwd())) return resuser; } return null; }
到此这篇关于SpringSecurity使用PasswordEncoder加密用户密码的示例代码的文章就介绍到这了,更多相关SpringSecurity PasswordEncoder加密密码内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论