我的第一个项目(六):(前后端)密码校验

打印 上一主题 下一主题

主题 650|帖子 650|积分 1950

好家伙,
 
xdm,密码验证忘写了,哈哈
bug展示:
1.登陆没有密码验证

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

 (小问题)
要是这么上线估计直接寄了
 
 
分析一波密码校验怎么做:
 
前端输完用户名密码之后,将数据发送到后端处理
后端要做以下几件事
①先确认这个用户名已注册
②我们拿着这个用户名去数据库中找对应的数据,拿到密码
③将前端发过来的密码与后端找到的密码进行比较
对了返回true,不对就false,
返回给前端
完成密码校验
 
 
1.来看看登陆这一部分涉及的代码:

SysUserController.java
  1. <strong>@PostMapping("login")
  2.     public CommonResp login(@RequestBody SysUserLoginReq req){
  3. //        zxcv1234
  4.         req.setPassword(DigestUtils.md5DigestAsHex(req.getPassword().getBytes()));
  5.         CommonResp resp = new CommonResp<>();
  6.         SysUserLoginResp loginResp = sysUserService.login(req);
  7.         if (loginResp == null) {
  8.             resp.setSuccess(false);
  9.         }
  10.         resp.setContent(loginResp);
  11.         return resp;
  12.     }</strong>
复制代码
SysUserServicelmpl.java中重写login方法:
  1. <strong>@Override
  2.     public SysUserLoginResp login(SysUserLoginReq req) {
  3.         SysUserEntity userDb = selectByLoginName(req.getLoginName());
  4.         QueryWrapper<SysUserEntity> wrapper = new QueryWrapper<>();
  5.         if(ObjectUtils.isEmpty(userDb)){
  6.             //用户不存在
  7.             return null;
  8.         }else {
  9.             String s1 = userDb.getPassword();
  10.             String s2 = req.getPassword();
  11.             //进行字符串校验
  12.             if(s1.equals(s2)){
  13.                 //密码验证成功
  14.                 SysUserLoginResp userLoginResp = CopyUtil.copy(userDb, SysUserLoginResp.class);
  15.                 return userLoginResp;
  16.             }else {
  17.                 //密码校验失败
  18.                 return null;
  19.             }
  20.         }
  21.     }
  22.     //查询loginName是否被注册
  23.     public SysUserEntity selectByLoginName(String loginName){
  24.         //QueryWrapper<>()
  25.         QueryWrapper<SysUserEntity> wrapper = new QueryWrapper<>();
  26.         //wrapper.lambda().eq()单表查询,在"SysUserEntity::getLoginName"找一个指定的"loginName"
  27.         wrapper.lambda().eq(SysUserEntity::getLoginName,loginName);
  28.         //BaseMapper的selectList()方法,根据id批量查询
  29.         List<SysUserEntity> userEntityList = sysUserMapper.selectList(wrapper);
  30.         //CollectionUtils.isEmpty()判断集合是否为空
  31.         if(CollectionUtils.isEmpty(userEntityList)){
  32.             //若判断为空,则返回null,意思是没被注册过
  33.             return  null;
  34.         }else {
  35.             //查到了,将这条数据返回
  36.             return userEntityList.get(0);
  37.         }
  38.     }</strong>
复制代码
 
 
 
2.先确认这个用户名已注册
  1. <strong>   //wrapper.lambda().eq()单表查询,在"SysUserEntity::getLoginName"找一个指定的"loginName"
  2.         wrapper.lambda().eq(SysUserEntity::getLoginName,loginName);</strong>
复制代码
lambda表达式看不懂可以点开看一下:
Java Lambda 表达式 | 菜鸟教程 (runoob.com)
 
 
 
3.我们拿着这个用户名去数据库中找对应的数据,拿到密码
  1. <strong>     //BaseMapper的selectList()方法,根据id批量查询
  2.         List<SysUserEntity> userEntityList = sysUserMapper.selectList(wrapper);
  3.         //CollectionUtils.isEmpty()判断集合是否为空
  4.         if(CollectionUtils.isEmpty(userEntityList)){
  5.             //若判断为空,则返回null,意思是没被注册过
  6.             return  null;
  7.         }else {
  8.             //查到了,将这条数据返回
  9.             return userEntityList.get(0);
  10.         }</strong>
复制代码
 
 
 
4.将前端发过来的密码与后端找到的密码进行比较
  1. <strong>String s1 = userDb.getPassword();
  2.             String s2 = req.getPassword();
  3.             //进行字符串校验
  4.             if(s1.equals(s2)){
  5.                 //密码验证成功
  6.                 SysUserLoginResp userLoginResp = CopyUtil.copy(userDb, SysUserLoginResp.class);
  7.                 return userLoginResp;
  8.             }else {
  9.                 //密码校验失败
  10.                 return null;
  11.             }</strong>
复制代码
 
不要写成以下形式,
  1. <strong>       String a = userDb.getPassword();
  2.             String b = req.getPassword();
  3.             if(a==b){
  4.                 SysUserLoginResp userLoginResp = CopyUtil.copy(userDb, SysUserLoginResp.class);
  5.                 return userLoginResp;
  6.        }else {
  7.                 //密码校验失败
  8.                 return null;
  9.             }</strong>
复制代码
a,b字符串并不指向同一对象,
所以,即使字符串完全相同,a==b也是false
 
 
5.前端的校验部分:

作用:防止输入空值无限注册
  1. <strong>//表单验证
  2.       if (this.loginForm.loginName == "") {
  3.         this.$message({
  4.           message: '请输入用户名',
  5.           type: 'error'
  6.         });
  7.         return;
  8.       }
  9.       if (this.loginForm.password == "") {
  10.         this.$message({
  11.           message: '请输入密码',
  12.           type: 'error'
  13.         });
  14.         return;
  15.       }
  16.       //发送登陆请求
  17.       if (this.loginForm.loginName != "" && this.loginForm.password != "") {
  18.         this.axios.post('http://localhost:3312/sys-user/login', this.loginForm).then((resp) => {
  19.           console.log(resp);
  20.           let data = resp.data;
  21.           //
  22.           if (data.success) {
  23.             this.loginForm = {};
  24.             this.$message({
  25.               message: '登陆成功!!!',
  26.               type: 'success'
  27.             });
  28.             this.$router.push({ path: '/Home' })
  29.           } else {
  30.             this.$message({
  31.               message: '登陆失败,密码错误或用户名未注册',
  32.               type: 'error'
  33.             });
  34.             console.log(data)
  35.           }
  36.         })
  37.       }</strong>
复制代码
(好烂的写法)
 
 
 
6.效果展示:


 
 
 
7.源码分享:

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

悠扬随风

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表