详解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 相关文章推荐
JavaScript 获取用户客户端操作系统版本
Aug 25 Javascript
Jquery+JSon 无刷新分页实现代码
Apr 01 Javascript
JQuery魔力之$("tagName")与selector
Mar 05 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
Oct 28 Javascript
JavaScript SetInterval与setTimeout使用方法详解
Nov 15 Javascript
JavaScript语言对Unicode字符集的支持详解
Dec 30 Javascript
解析Javascript单例模式概念与实例
Dec 05 Javascript
JavaScript组件开发之输入框加候选框
Mar 10 Javascript
详解Vuex中mapState的具体用法
Sep 28 Javascript
vue项目首屏加载时间优化实战
Apr 23 Javascript
toString.call()通用的判断数据类型方法示例
Aug 28 Javascript
vue动态设置路由权限的主要思路
Jan 13 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
PHP设置图片文件上传大小的具体实现方法
2013/10/11 PHP
php+mysqli实现将数据库中一张表信息打印到表格里的方法
2015/01/28 PHP
PHP命令Command模式用法实例分析
2018/08/08 PHP
php xhprof使用实例详解
2019/04/15 PHP
基于PHP实现发微博动态代码实例
2020/12/11 PHP
jQuery EasyUI API 中文文档 - Pagination分页
2011/09/29 Javascript
通过百度地图获取公交线路的站点坐标的js代码
2012/05/11 Javascript
jQuery筛选器children()案例详解(图文)
2013/02/17 Javascript
JavaScript sub方法入门实例(把字符串显示为下标)
2014/10/17 Javascript
javascript关于继承的用法汇总
2014/12/20 Javascript
JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
2015/12/13 Javascript
Javascript OOP之面向对象
2016/07/31 Javascript
深入浅析JS是按值传递还是按引用传递(推荐)
2016/09/18 Javascript
省市区三级联动jquery实现代码
2020/04/15 Javascript
基于vue.js实现侧边菜单栏
2017/03/20 Javascript
JavaScript结合HTML DOM实现联动菜单
2017/04/05 Javascript
JavaScript基础之静态方法和实例方法分析
2018/12/26 Javascript
小程序绑定用户方案优化小结
2019/05/15 Javascript
浅谈es6中的元编程
2020/12/01 Javascript
[02:59]2014DOTA2西雅图国际邀请赛 圆满落幕中国夺冠
2014/07/23 DOTA
Python3实现发送QQ邮件功能(附件)
2020/12/23 Python
Python使用Django实现博客系统完整版
2020/09/29 Python
Python3列表内置方法大全及示例代码小结
2019/05/10 Python
pyhton中__pycache__文件夹的产生与作用详解
2019/11/24 Python
如何使用Python破解ZIP或RAR压缩文件密码
2020/01/09 Python
HTML5新特性之用SVG绘制微信logo
2016/02/03 HTML / CSS
html5 div布局与table布局详解
2016/11/16 HTML / CSS
HTML5自定义视频播放器源码
2020/01/06 HTML / CSS
品学兼优的大学生自我评价
2013/09/20 职场文书
新学期家长寄语
2014/01/19 职场文书
员工考核管理制度
2014/02/02 职场文书
教师师德反思材料
2014/02/15 职场文书
业务员自荐信范文
2014/04/20 职场文书
幼儿园园务工作总结2015
2015/05/18 职场文书
巴黎圣母院读书笔记
2015/06/26 职场文书
JavaScript原型链中函数和对象的理解
2022/06/16 Javascript