详解node登录接口之密码错误限制次数(含代码)


Posted in Javascript onOctober 25, 2019

密码次数尝试,可以有效的保护用户账户安全,有了限制之后,就算用量子计算机都束手无策。

银行卡也是这种,尝试次数过多,就锁定,说不定还会自动报警。

效果图

详解node登录接口之密码错误限制次数(含代码) 

实现思路

 数据库表设计

在表里面添加一个字段,string类型。里面包含两个数据,密码失败尝试日期 和 次数 如 2019a10a23|10
这里我使用|做数据段分割,a字母做日期分割

代码逻辑

当记录的日期是当天,那么密码错误的时候, 次数+1

当记录的日期不是当天,那么重置

代码封装

这是我实现的简单代码封装

(这里只实现了一天内x次的简单校验,高级规则需要自己改)

/**
 * 尝试登录次数限制
 * login_number [日期, 次数].join('|')
 * 更新到数据库 (更新数据) => {}
 * return {
 * run bool true: 超过 false: 正常
 * start 登录失败后修改状态
 * }
 */
exports.Login_n = (login_number, 更新到数据库) => {
  let run = true
  let 当日登录次数 = 0
  let 当日最多尝试次数 = 10
  var getD = () => {
    var date = new Date()
    var d = [date.getUTCFullYear(), date.getMonth() + 1, date.getDate()].join('a')
    return d
  }
  if(login_number){
    let date = login_number.split('|')[0]
    let n = login_number.split('|')[1]
    if(date == getD()){
      当日登录次数 = (+n)
    }
  }
  if(当日登录次数 >= 当日最多尝试次数){
    run = false
  }
  let 登录失败后修改状态函数 = () => {
    let add_login_number
    let 非当日 = () => {
      更新到数据库([getD(), 0].join('|'))
    }
    let 今天 = (n) => {
      更新到数据库([getD(), n].join('|'))
    }
    if(!login_number){
      非当日()
    }else{
      let date = login_number.split('|')[0]
      let n = login_number.split('|')[1]
      if(date == getD()){
        今天((+n) + 1)
      }
    }
  }
  return {
    run,
    start: 登录失败后修改状态函数
  }
}

使用

引入 & 设置状态

var { Login_n } = require('./login_n')
var login_n = Login_n(login_number, (v) => {
  db('all', 'update t_user set login_number=? where id=?', [v, id]).then(results => {
    console.log('修改登录失败次数记录成功')
  })
})

拦截

if(!login_n.run){
  resolve({
    code: 1,
    msg: '账户异常锁定, 请明天再试'
  })
  return
}

密码错误开始记录

if(results[0].pw !== pw){
  // 登录失败,更新登录次数
  login_n.start()
	resolve({
    code: 1,
    msg: '密码错误'
  })
	return
}

登录完整代码

需要引入上面的(错误限制次数代码)

这里的md5,是为了双重加密,当内部员工拿到数据库密码后也不容易登录, 依赖nodejs内置包 crypto

var crypto = require('crypto')
exports.phone_pw_login = (params, req) => new Promise((resolve, reject) => {
  var { Login_n } = require('./login_n')
  let {pass, phone} = params
  var md5 = crypto.createHash("md5");
  let pw = md5.update(pass).digest('hex').toUpperCase()
  db('all', 'SELECT phone, pw, id, name, login_number from t_user WHERE phone=?', [phone]).then(results => {
    let { login_number, id } = results[0]
    // 账号不存在
    if(results.length == 0){
		  resolve({
		    code: 1,
		    msg: '密码错误', // 避免得知是否注册账号
		  })
    	return
    }

    // 次数校验
    var login_n = Login_n(login_number, (v) => {
      db('all', 'update t_user set login_number=? where id=?', [v, id]).then(results => {
        console.log('修改登录失败次数记录成功')
      })
    })
    if(!login_n.run){
      resolve({
        code: 1,
        msg: '账户异常锁定, 请明天再试'
      })
      return
    }

    if(results[0].pw !== pw){
      // 登录失败,更新登录次数
      login_n.start()
    	resolve({
		    code: 1,
		    msg: '密码错误'
      })
    	return
    } 
    let token = Jwt.Create({phone: results[0].phone, id: id, pw})
    
    resolve({
	    code: 200,
	    msg: {
	    	name: results[0].name,
	    	phone: results[0].phone,
	    	token,
	    }
	  })
  })
  .catch(error => {
    console.log(error)
    resolve({
      code: 1,
      msg: '服务器错误'
    })
  })
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
Oct 11 Javascript
js实现人才网站职位选择功能的方法
Aug 14 Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
Oct 28 Javascript
Bootstrap中glyphicons-halflings-regular.woff字体报404错notfound的解决方法
Jan 19 Javascript
基于javascript的异步编程实例详解
Apr 10 Javascript
JavaScript中offsetWidth的bug及解决方法
May 17 Javascript
Vue框架中正确引入JS库的方法介绍
Jul 30 Javascript
iview在vue-cli3如何按需加载的方法
Oct 31 Javascript
灵活使用console让js调试更简单的方法步骤
Apr 23 Javascript
layer.alert回调函数执行关闭弹窗的实例
Sep 11 Javascript
解决Antd Table表头加Icon和气泡提示的坑
Nov 17 Javascript
vue+element_ui上传文件,并传递额外参数操作
Dec 05 Vue.js
Vue 用Vant实现时间选择器的示例代码
Oct 25 #Javascript
vue登录以及权限验证相关的实现
Oct 25 #Javascript
vue-next/runtime-core 源码阅读指南详解
Oct 25 #Javascript
JS实现简单tab选项卡切换
Oct 25 #Javascript
vue项目从node8.x升级到12.x后的问题解决
Oct 25 #Javascript
JS实现骰子3D旋转效果
Oct 24 #Javascript
Vue可自定义tab组件用法实例
Oct 24 #Javascript
You might like
德生BCL3000的电路分析和打磨
2021/03/02 无线电
php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
2011/02/08 PHP
php去除数组中重复数据
2014/11/18 PHP
php htmlentities()函数的定义和用法
2016/05/13 PHP
让您的菜单不离网站
2006/10/03 Javascript
jQuery对象[0]是什么含义?
2010/07/31 Javascript
javascript结合html5 canvas实现(可调画笔颜色/粗细/橡皮)的涂鸦板
2013/04/27 Javascript
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
javascript将相对路径转绝对路径示例
2014/03/14 Javascript
谷歌地图打不开的解决办法
2014/08/07 Javascript
js使用post 方式打开新窗口
2015/02/26 Javascript
浅谈JavaScript的事件
2015/02/27 Javascript
javascript最基本的函数汇总
2015/06/25 Javascript
jQuery中使用animate自定义动画的方法
2016/05/29 Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
2016/12/28 Javascript
js正则表达式验证表单【完整版】
2017/03/06 Javascript
jq checkbox 的全选并ajax传参的实例
2017/04/01 Javascript
JS面向对象的程序设计相关知识小结
2018/05/26 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
2019/04/26 Javascript
JavaScript中继承原理与用法实例入门
2020/05/09 Javascript
javascript中call,apply,bind的区别详解
2020/12/11 Javascript
[00:32]2018DOTA2亚洲邀请赛Mineski出场
2018/04/04 DOTA
python+selenium实现登录账户后自动点击的示例
2017/12/22 Python
Python中字符串List按照长度排序
2019/07/01 Python
在django中实现choices字段获取对应字段值
2020/07/12 Python
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
医院总经理岗位职责
2014/02/04 职场文书
大龄毕业生求职别忘职业规划
2014/03/11 职场文书
工程索赔意向书
2014/08/30 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
2014年社区计生工作总结
2014/11/18 职场文书
保研推荐信范文
2015/03/25 职场文书
债务纠纷起诉书
2015/05/20 职场文书
烈士陵园扫墓感想
2015/08/07 职场文书
组织委员竞选稿
2015/11/21 职场文书
2016年度农村党员干部主题教育活动总结
2016/04/06 职场文书