当前位置: 首页 > news >正文

【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

      在配置类中创建一个 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


http://www.mrgr.cn/news/23828.html

相关文章:

  • Vue组件:插槽
  • 3、三维重建-NeuralRecon
  • 哪个牌子的超声波清洗器好?盘点几款清洗效果不错的超声波清洗机
  • 《在 Windows 系统中配置 Python 3.11 环境安装教程》
  • Java集合面试题
  • 【JS逆向学习】大学竞争力2021排行榜(md5加密)
  • CATH数据库数据下载
  • CSP-J算法基础 计数排序
  • 文案改写工具有哪些?5款智能改写工具迅速提升文案品质
  • c/c++ *和后置++的优先级
  • 驱动与应用的编译
  • 金蝶云星空查询SQL
  • iText2KG:显著降低LLM构建知识图谱时的幻觉现象
  • vue页面使用自定义字体
  • pointpillar部署-TensorRT实现(一)
  • USB转百兆网卡芯片CH397在多平台下使用说明
  • Java题集练习1
  • HTTP 协议和 APACHE 服务
  • 代码随想录算法训练营第二十七天 | 455.分发饼干,376. 摆动序列,53. 最大子序和
  • STM32时钟配置图详解