详解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插件
Nov 24 Javascript
通过Javascript创建一个选择文件的对话框代码
Jun 16 Javascript
JS的get和set使用示例
Feb 20 Javascript
jQuery制作简洁的多级联动Select下拉框
Dec 23 Javascript
推荐一款jQuery插件模板
Jan 09 Javascript
jQuery中hover与mouseover和mouseout的区别分析
Dec 24 Javascript
jQuery插件echarts去掉垂直网格线用法示例
Mar 03 Javascript
微信小程序的生命周期的详解
Oct 19 Javascript
JavaScript数组push方法使用注意事项
Oct 30 Javascript
JavaScript设计模式之享元模式实例详解
Jan 17 Javascript
Vant picker 多级联动操作
Nov 02 Javascript
vue实现两个组件之间数据共享和修改操作
Nov 12 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递归获取目录内所有文件的实现方法
2016/11/01 PHP
PHP常用函数之base64图片上传功能详解
2019/10/21 PHP
Swoole扩展的6种模式深入详解
2021/03/04 PHP
Mootools 1.2教程 正则表达式
2009/09/15 Javascript
Js获取事件对象代码
2010/08/05 Javascript
jquery高效反选具体实现
2013/05/05 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
2014/05/04 Javascript
JQuery+CSS实现图片上放置按钮的方法
2015/05/29 Javascript
详解JavaScript for循环中发送AJAX请求问题
2020/06/23 Javascript
浅谈JavaScript的全局变量与局部变量
2016/06/10 Javascript
详解javascript中对数据格式化的思考
2017/01/23 Javascript
Webpack打包慢问题的完美解决方法
2017/03/16 Javascript
微信小程序将字符串生成二维码图片的操作方法
2018/07/17 Javascript
2019 年编写现代 JavaScript 代码的5个小技巧(小结)
2019/01/15 Javascript
js实现开关灯效果
2020/03/30 Javascript
JS实现可控制的进度条
2020/03/25 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
2020/07/13 Javascript
element 动态合并表格的步骤
2020/12/31 Javascript
[26:21]浴火之凤-TI4世界冠军Newbee战队纪录片
2014/08/07 DOTA
python中mechanize库的简单使用示例
2014/01/10 Python
python获取远程图片大小和尺寸的方法
2015/03/26 Python
python实现搜索本地文件信息写入文件的方法
2016/02/22 Python
python+selenium+autoit实现文件上传功能
2017/08/23 Python
对python Tkinter Text的用法详解
2018/10/11 Python
深入浅析Python2.x和3.x版本的主要区别
2018/11/30 Python
利用arcgis的python读取要素的X,Y方法
2018/12/22 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
2019/08/05 Python
Django模板语言 Tags使用详解
2019/09/09 Python
Django配置跨域并开发测试接口
2020/11/04 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
手机配件第一品牌:ZAGG
2017/05/28 全球购物
布里斯班女装时尚品牌:Adrift
2017/12/28 全球购物
军校本科大学生自我评价
2014/01/14 职场文书
化妆品促销方案
2014/02/24 职场文书
go语言中fallthrough的用法说明
2021/05/06 Golang
SpringBoot中获取profile的方法详解
2022/04/08 Java/Android