详解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 实现Tab效果 思路是js思路
Mar 02 Javascript
Jquery中val()表单取值赋值的实例代码
Aug 15 Javascript
使用js检测浏览器是否支持html5中的video标签的方法
Mar 12 Javascript
js判断字符长度及中英文数字等
Mar 19 Javascript
JS实现超过长度限制后自动跳转下一款文本框的方法
Feb 23 Javascript
详解AngularJS中自定义指令的使用
Jun 17 Javascript
node.js下LDAP查询实例分享
Sep 30 Javascript
非常棒的jQuery图片轮播效果
Apr 17 Javascript
理解javascript中的Function.prototype.bind的方法
Feb 03 Javascript
Vue 2.0+Vue-router构建一个简单的单页应用(附源码)
Mar 14 Javascript
js 两个日期比较相差多少天的实例
Oct 19 Javascript
使用JS监听键盘按下事件(keydown event)
Nov 07 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的网址
2006/11/25 PHP
使用PHP求两个文件的相对路径
2013/06/20 PHP
php加密解密函数authcode的用法详细解析
2013/10/28 PHP
ThinkPHP框架任意代码执行漏洞的利用及其修复方法
2014/07/04 PHP
jquery调用wcf并展示出数据的方法
2011/07/07 Javascript
jquery图片延迟加载 前端开发技能必备系列
2012/06/18 Javascript
gridpanel动态加载数据的实例代码
2013/07/18 Javascript
JS获取浏览器语言动态加载JS文件示例代码
2014/10/31 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
JavaScript实现cookie的写入、读取、删除功能
2015/11/05 Javascript
javascript实现Email邮件显示与删除功能
2015/11/21 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
2015/11/23 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
Ext JS动态加载JavaScript创建窗体的方法
2016/06/23 Javascript
js将键值对字符串转为json字符串的方法
2018/03/30 Javascript
深入理解JavaScript的async/await
2018/08/05 Javascript
如何为vue的项目添加单元测试
2018/12/19 Javascript
elementUI多选框反选的实现代码
2019/04/03 Javascript
JavaScript使用表单元素验证表单的示例代码
2019/08/20 Javascript
JavaScript实现图片放大预览效果
2020/11/02 Javascript
[52:39]完美世界DOTA2联赛PWL S3 CPG vs Forest 第一场 12.16
2020/12/17 DOTA
python开发中module模块用法实例分析
2015/11/12 Python
详解Python实现按任意键继续/退出的功能
2016/08/19 Python
python中文编码与json中文输出问题详解
2018/08/24 Python
python组合无重复三位数的实例
2018/11/13 Python
python的命名规则知识点总结
2019/10/04 Python
python实现广度优先搜索过程解析
2019/10/19 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
2020/05/13 Python
使用CSS实现阅读进度条
2017/02/27 HTML / CSS
美国设计师精美珠宝购物网:Netaya
2016/08/28 全球购物
加拿大奢华时装品牌:Mackage
2018/01/10 全球购物
英国豪华家具和经典家居饰品购物网站:OKA
2020/06/05 全球购物
办公室内勤岗位职责范本
2013/12/09 职场文书
书法培训心得体会
2014/01/05 职场文书
专升本学生毕业自我鉴定
2014/10/04 职场文书
2019年最新版见习人员管理制度!
2019/07/08 职场文书