当前位置: 首页 > 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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于单片机的简易录音笔设计
  • 九月五日(k8s配置)
  • 五种IO模型
  • 个人简历 (自己设计的)
  • JS_阿里云oss视频上传后,如何获取视频封面
  • 深度学习速通系列:鲁棒性和稳定性
  • MySQL JDBC URL各参数详解
  • 数据结构:图
  • 前端AST
  • 码上进阶_刷题模块测试_用例设计
  • 通过FFmpeg和URL查看流的编码格式
  • 快速排序+归并排序代码回顾
  • java实操(二)-酒店管理系统
  • python的sqlalchemy使用@contextmanager来定义上下文管理器
  • MySQL进阶篇4 - 锁
  • Bootstrap JS插件Alert源码分析
  • ERLANG 网工修炼笔记 ---- UDP
  • flask接收请求并推入栈
  • Java IO学习笔记一
  • JavaScript服务器推送技术之 WebSocket
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • js中forEach回调同异步问题
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • SSH 免密登录
  • TCP拥塞控制
  • Vue--数据传输
  • 爱情 北京女病人
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 前端性能优化--懒加载和预加载
  • HanLP分词命名实体提取详解
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • #Linux(权限管理)
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • (07)Hive——窗口函数详解
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (六)vue-router+UI组件库
  • (算法)区间调度问题
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET Project Open Day(2011.11.13)
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .Net6使用WebSocket与前端进行通信
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • [12] 使用 CUDA 加速排序算法
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...