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

第一个,项目,前后,密码,校验 · 浏览次数 : 399

小编点评

**密码校验流程:** 1. 用户在输入用户名和密码时,将数据发送到后端服务器进行密码校验。 2. 后端服务器首先查询数据库中是否存在该用户名,如果存在,就进行密码校验。 3. 如果用户名和密码匹配,就返回一个成功的响应,否则返回一个失败响应。 **代码分析:** ```java @Override public SysUserLoginResp login(SysUserLoginReq req) { // 查询用户是否存在 SysUserEntity userDb = selectByLoginName(req.getLoginName()); // 如果用户存在,进行密码校验 if (userDb != null) { // 比较密码,如果匹配,返回成功响应 if (s1.equals(s2)) { // 密码校验成功,返回成功响应 SysUserLoginResp userLoginResp = CopyUtil.copy(userDb, SysUserLoginResp.class); return userLoginResp; } else { // 密码校验失败,返回失败响应 return null; } } else { // 用户不存在,返回失败响应 return null; } } ``` **问题解答:** * 用户名重复注册会导致密码校验失败。 * 如果用户名已注册,但密码错误,也会返回失败响应。 **建议:** * 确保用户名和密码的格式正确。 * 使用正则表达式进行密码校验。 * 输出详细的错误信息,方便调试。

正文

好家伙,

 

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

bug展示:

1.登陆没有密码验证

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

 (小问题)

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

 

 

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

 

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

后端要做以下几件事

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

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

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

对了返回true,不对就false,

返回给前端

完成密码校验

 

 

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

SysUserController.java

@PostMapping("login")
    public CommonResp login(@RequestBody SysUserLoginReq req){
//        zxcv1234
        req.setPassword(DigestUtils.md5DigestAsHex(req.getPassword().getBytes()));
        CommonResp resp = new CommonResp<>();
        SysUserLoginResp loginResp = sysUserService.login(req);
        if (loginResp == null) {
            resp.setSuccess(false);
        }
        resp.setContent(loginResp);
        return resp;
    }

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

 

与 我的第一个项目(六):(前后端)密码校验相似的内容:

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

好家伙, xdm,密码验证忘写了,哈哈 bug展示: 1.登陆没有密码验证 主要体现为,乱输也能登进去 (小问题) 要是这么上线估计直接寄了 分析一波密码校验怎么做: 前端输完用户名密码之后,将数据发送到后端处理 后端要做以下几件事 ①先确认这个用户名已注册 ②我们拿着这个用户名去数据库中找对应的数

python独立脚本应用Django项目的环境

一、需求说明 一直用 Django 在开发一个网站项目,其中的注册用户和登录,都是使用Django自带的认证系统。主要是对密码的加密,在注册或者登录的时候,前端传递过来的密码,我会使用Django的set_password()方法再加密一次 经过加密后的数据库中的数据样子如下: 现在我有另外一个需求

我的第一个项目(五):(前后端)注册用户名查重

好家伙, bug终究还是来了,而且是很离谱的bug 来吧,发现问题,再解决问题 1.注册无法检测到用户名重复 也就是说一个用户名可无限注册, 来看bug(。。。) (看来是后端验证逻辑出了问题) 要是这么上线估计直接寄了 2.完成注册用户名查重 大概率是后端出了问题 这里我们先去看看后端,从后端去改

我的第一个项目(四):(前端)发送请求以及表单校验

好家伙,本篇将继续完善前端界面 效果展示: 1.注册登陆 (后端已启动) 2.注册表单验证 (前端实现的表单验证) 在此之前: 我的第一个项目(二):使用Vue做一个登录注册界面 - 养肥胖虎 - 博客园 (cnblogs.com) 后端部分: 我的第一个项目(三):注册登陆功能(后端) - 养肥胖

我的第一个项目(十二) :分数和生命值的更新(后端增删查改的"改")

好家伙,写后端,这多是一件美逝. 关于这个项目的代码前面的博客有写 我的第一个独立项目 - 随笔分类 - 养肥胖虎 - 博客园 (cnblogs.com) 现在,我们登陆进去了,我开始和敌人战斗,诶,打到一百分了,我现在要把这个分数保存起来 1.前端先把测试样例写好 随便写一个测试样例

我的第一个项目(三):注册登陆功能(后端)

好家伙,前端出了点bug 我们来搞定后端先: 后端我们用的框架是Spring boot 数据库:MySQl 代码已开源,连接在最后 新建项目: 只点Java Web 项目目录如下: 1.首先,我们在pom.xml文件中导入第三方包: web服务,mysql连接驱动等一系列包 pom.xml文件: <

我的第一个项目(十五) :完成数据保存功能(后端,改update)

好家伙, 代码已开源(Gitee) PH-planewar: 个人开发的全栈小游戏 前端:vue2 + element-ui 后端: Springboot + mybatis-plus 数据库: mysql 目前实现功能: 1.注册登陆 2.游戏数据保存 3.游戏运行 (gitee.com) 后端这

我的第一个项目(十四) :完成数据保存功能(前端,增查改接口)

好家伙,天天拖,终于写完了 代码已开源(Gitee) PH-planewar: 个人开发的全栈小游戏 前端:vue2 + element-ui 后端: Springboot + mybatis-plus 数据库: mysql 目前实现功能: 1.注册登陆 2.游戏数据保存 3.游戏运行 (gitee

SpringSecurity-前后端分离教程

1、简介 Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的比较多,因为相比与SpringSec

NetCore 开源项目

前言:工作几年了,面试的时候问一堆,实则都是增删改查。感觉做net搞上位机的比较多,然而我一直做的都是web方向。以前还会背八股文,现在工作之后只会增删改,CV了。不知道后面会不会转行,唉~ 这个既是教程也是学习,我想尝试自己去做一个开源的前后端项目,看看我现在到底能做个什么样。 这篇文章,算是个开