详解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中与toggleClass等价的程序段 以及未来学习的方向
Mar 18 Javascript
jQuery之尺寸调整组件的深入解析
Jun 19 Javascript
jquery如何实现在加载完iframe的内容后再进行操作
Sep 10 Javascript
JS获取节点的兄弟,父级,子级元素的方法
Jan 09 Javascript
Jquery对数组的操作技巧整理
Mar 25 Javascript
jQuery实现ichat在线客服插件
Dec 29 Javascript
JS打开新窗口防止被浏览器阻止的方法
Jan 03 Javascript
如何解决hover在ie6中的兼容性问题
Dec 15 Javascript
jQuery实现滚动条滚动到子元素位置(方便定位)
Jan 08 Javascript
Angular 组件之间的交互的示例代码
Mar 24 Javascript
手写简单的jQuery雪花飘落效果实例
Apr 22 jQuery
Vue iview-admin框架二级菜单改为三级菜单的方法
Jul 03 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
set_include_path在win和linux下的区别
2008/01/10 PHP
Excel数据导入Mysql数据库的实现代码
2008/06/05 PHP
php判断一个数组是否为有序的方法
2015/03/27 PHP
PHP 反射(Reflection)使用实例
2015/05/12 PHP
Symfony2函数用法实例分析
2016/03/18 PHP
Smarty保留变量用法分析
2016/05/23 PHP
PHP实现的简单排列组合算法应用示例
2017/06/20 PHP
js获取url中指定参数值的示例代码
2013/12/14 Javascript
jquery 选取方法都有哪些
2014/05/18 Javascript
JavaScript获取当前cpu使用率的方法
2015/12/15 Javascript
Node.js返回JSONP详解
2016/05/18 Javascript
老生常谈 js中this的指向
2016/06/30 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
2016/12/23 Javascript
利用C/C++编写node.js原生模块的方法教程
2017/07/07 Javascript
基于构造函数的五种继承方法小结
2017/07/27 Javascript
Vue2.0父子组件传递函数的教程详解
2017/10/16 Javascript
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
vue封装一个简单的div框选时间的组件的方法
2019/01/06 Javascript
Koa 中的错误处理解析
2019/04/09 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
2019/06/13 Javascript
Vue之Mixins(混入)的使用方法
2019/09/24 Javascript
python在控制台输出进度条的方法
2015/06/20 Python
Python中函数eval和ast.literal_eval的区别详解
2017/08/10 Python
python 递归遍历文件夹,并打印满足条件的文件路径实例
2017/08/30 Python
Python进程间通信Queue实例解析
2018/01/25 Python
python调用其他文件函数或类的示例
2019/07/16 Python
Python  Asyncio模块实现的生产消费者模型的方法
2021/03/01 Python
一款纯css3实现简单的checkbox复选框和radio单选框
2014/11/05 HTML / CSS
使用phonegap播放音频的实现方法
2017/03/31 HTML / CSS
马来西亚在线健康商店:Medipal Malaysia
2020/04/13 全球购物
外科实习自我鉴定
2013/10/06 职场文书
土木建筑学生自我评价
2014/01/14 职场文书
机械设计及其自动化专业求职信
2014/06/09 职场文书
Java集成swagger文档组件
2021/06/28 Java/Android
继承Win10缺点!教你关闭Win11烦人的网络搜索
2021/11/23 数码科技
Java时间工具类Date的常用处理方法
2022/05/25 Java/Android