详解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的标签智能验证实现代码
Dec 27 Javascript
js防止表单重复提交实现代码
Sep 05 Javascript
jquery实现焦点图片随机切换效果的方法
Mar 12 Javascript
JavaScript获取页面上被选中文字的方法技巧
Mar 13 Javascript
JQuery显示、隐藏div的几种方法简明总结
Apr 16 Javascript
js淡入淡出的图片轮播效果代码分享
Aug 24 Javascript
js 将input框中的输入自动转化成半角大写(税号输入框)
Feb 16 Javascript
node.js多个异步过程中判断执行是否完成的解决方案
Dec 10 Javascript
axios拦截设置和错误处理方法
Mar 05 Javascript
JS数组去重常用方法实例小结【4种方法】
May 28 Javascript
vue项目中使用lib-flexible解决移动端适配的问题解决
Aug 23 Javascript
Vue中的v-for指令不起效果的解决方法
Sep 27 Javascript
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
用PHP动态创建Flash动画
2006/10/09 PHP
CodeIgniter中实现泛域名解析
2014/07/19 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
2014/11/25 PHP
利用PHP抓取百度阅读的方法示例
2016/12/18 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
PHP实现将base64编码字符串转换成图片示例
2018/06/22 PHP
PHP实现的操作数组类库定义与用法示例
2019/05/24 PHP
Aster vs KG BO3 第一场2.19
2021/03/10 DOTA
Js 去掉字符串中的空格(实现代码)
2013/11/19 Javascript
Javascript快速排序算法详解
2014/12/03 Javascript
微信WeixinJSBridge API使用实例
2015/05/25 Javascript
JQuery包裹DOM节点的方法
2015/06/11 Javascript
BootStrap按钮标签及基本样式
2016/11/23 Javascript
Javascript 两种刷新方法以及区别和适用范围
2017/01/17 Javascript
Angular搜索场景中使用rxjs的操作符处理思路
2018/05/30 Javascript
详解javascript中的Error对象
2019/04/25 Javascript
多线程爬虫批量下载pcgame图片url 保存为xml的实现代码
2013/01/17 Python
python装饰器简介---这一篇也许就够了(推荐)
2019/04/01 Python
python 如何将数据写入本地txt文本文件的实现方法
2019/09/11 Python
wxPython色环电阻计算器
2019/11/18 Python
Python pygame绘制文字制作滚动文字过程解析
2019/12/12 Python
python使用numpy实现直方图反向投影示例
2020/01/17 Python
Python脚本实现监听服务器的思路代码详解
2020/05/28 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
Python基于Socket实现简易多人聊天室的示例代码
2020/11/29 Python
python基于pexpect库自动获取日志信息
2021/02/01 Python
纯CSS3实现地球自转实现代码(图文教程附送源码)
2012/12/26 HTML / CSS
为有想象力的人提供的生活方式商店:Firebox
2018/06/04 全球购物
大学生优秀的自我评价分享
2013/10/22 职场文书
学生的自我鉴定范文
2013/10/24 职场文书
毕业学生推荐信
2013/12/01 职场文书
小学新教师培训方案
2014/02/03 职场文书
安全生产网格化管理实施方案
2014/03/01 职场文书
师德自我剖析材料范文
2014/10/06 职场文书
单位实习介绍信
2015/05/05 职场文书
考生诚信考试承诺书(2016版)
2016/03/25 职场文书