首页IT科技前后端分离密码加密解决方案(我的第一个项目(六):(前后端)密码校验)

前后端分离密码加密解决方案(我的第一个项目(六):(前后端)密码校验)

时间2025-05-04 19:18:36分类IT科技浏览5870
导读:好家伙,...

好家伙,

xdm,密码验证忘写了,哈哈

bug展示:

1.登陆没有密码验证

主要体现为,乱输也能登进去

(小问题)

要是这么上线估计直接寄了

分析一波密码校验怎么做:

前端输完用户名密码之后,将数据发送到后端处理

后端要做以下几件事

①先确认这个用户名已注册

②我们拿着这个用户名去数据库中找对应的数据,拿到密码

③将前端发过来的密码与后端找到的密码进行比较

对了返回true,不对就false,

返回给前端

完成密码校验

1.来看看登陆这一部分涉及的代码:

SysUserController.java

SysUserServicelmpl.java中重写login方法:

@Override public SysUserLoginResp login(SysUserLoginReq req) { SysUserEntity userDb = selectByLoginName(req.getLoginName()); QueryWrapper<SysUserEntity> wrapper = new QueryWrapper<>(); if(ObjectUtils.isEmpty(userDb)){ //用户不存在 return null; }else { String s1 = userDb.getPassword(); String s2 = req.getPassword(); //进行字符串校验 if(s1.equals(s2)){ //密码验证成功 SysUserLoginResp userLoginResp = CopyUtil.copy(userDb, SysUserLoginResp.class); return userLoginResp; }else { //密码校验失败 return null; } } } //查询loginName是否被注册 public SysUserEntity selectByLoginName(String loginName){ //QueryWrapper<>() QueryWrapper<SysUserEntity> wrapper = new QueryWrapper<>(); //wrapper.lambda().eq()单表查询,在"SysUserEntity::getLoginName"找一个指定的"loginName" wrapper.lambda().eq(SysUserEntity::getLoginName,loginName); //BaseMapper的selectList()方法,根据id批量查询 List<SysUserEntity> userEntityList = sysUserMapper.selectList(wrapper); //CollectionUtils.isEmpty()判断集合是否为空 if(CollectionUtils.isEmpty(userEntityList)){ //若判断为空            ,则返回null,意思是没被注册过 return null; }else { //查到了,将这条数据返回 return userEntityList.get(0); } }

2.先确认这个用户名已注册

   //wrapper.lambda().eq()单表查询,在"SysUserEntity::getLoginName"找一个指定的"loginName" wrapper.lambda().eq(SysUserEntity::getLoginName,loginName);

lambda表达式看不懂可以点开看一下:

Java Lambda 表达式 | 菜鸟教程 (runoob.com)

3.我们拿着这个用户名去数据库中找对应的数据,拿到密码

     //BaseMapper的selectList()方法,根据id批量查询 List<SysUserEntity> userEntityList = sysUserMapper.selectList(wrapper); //CollectionUtils.isEmpty()判断集合是否为空 if(CollectionUtils.isEmpty(userEntityList)){ //若判断为空                  ,则返回null,意思是没被注册过 return null; }else { //查到了,将这条数据返回 return userEntityList.get(0); }

4.将前端发过来的密码与后端找到的密码进行比较

String s1 = userDb.getPassword(); String s2 = req.getPassword(); //进行字符串校验 if(s1.equals(s2)){ //密码验证成功 SysUserLoginResp userLoginResp = CopyUtil.copy(userDb, SysUserLoginResp.class); return userLoginResp; }else { //密码校验失败 return null; }

不要写成以下形式,

       String a = userDb.getPassword(); String b = req.getPassword(); if(a==b){ SysUserLoginResp userLoginResp = CopyUtil.copy(userDb, SysUserLoginResp.class); return userLoginResp;        }else { //密码校验失败 return null; }

a,b字符串并不指向同一对象,

所以,即使字符串完全相同,a==b也是false

5.前端的校验部分:

作用:防止输入空值无限注册

//表单验证 if (this.loginForm.loginName == "") { this.$message({ message: 请输入用户名, type: error }); return; } if (this.loginForm.password == "") { this.$message({ message: 请输入密码, type: error }); return; } //发送登陆请求 if (this.loginForm.loginName != "" && this.loginForm.password != "") { this.axios.post(http://localhost:3312/sys-user/login, this.loginForm).then((resp) => { console.log(resp); let data = resp.data; // if (data.success) { this.loginForm = {}; this.$message({ message: 登陆成功!!!, type: success }); this.$router.push({ path: /Home }) } else { this.$message({ message: 登陆失败,密码错误或用户名未注册, type: error }); console.log(data) } }) }

(好烂的写法)

6.效果展示:

7.源码分享:

https://gitee.com/tang-and-han-dynasties/login-entity.git

声明:本站所有文章      ,如无特殊说明或标注      ,均为本站原创发布            。任何个人或组织                  ,在未征得本站同意时            ,禁止复制            、盗用                  、采集      、发布本站内容到任何网站            、书籍等各类媒体平台                  。如若本站内容侵犯了原著者的合法权益      ,可联系我们进行处理      。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
linux检测网卡(在Linux下确定网卡所使用驱动程序的方法)