详解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 1.3.2以上版本中出现pareseerror错误的解决方法
Jan 11 Javascript
JavaScript快速检测浏览器对CSS3特性的支持情况
Sep 26 Javascript
javascript中的onkeyup和onkeydown区别介绍
Apr 28 Javascript
图片上传判断及预览脚本的效果实例
Aug 07 Javascript
js 判断上传文件大小及格式代码
Nov 13 Javascript
js自动查找select下拉的菜单并选择(示例代码)
Feb 26 Javascript
关于JS中prototype的理解
Sep 07 Javascript
uploadify多文件上传参数设置技巧
Nov 16 Javascript
利用iscroll4实现轮播图效果实例代码
Jan 11 Javascript
基于滚动条位置判断的简单实例
Dec 14 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
Jul 23 jQuery
微信小程序实现文字跑马灯
May 26 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
采用memcache在web集群中实现session的同步会话
2014/07/05 PHP
php中session定期自动清理的方法
2015/11/12 PHP
PHP的数组中提高元素查找与元素去重的效率的技巧解析
2016/03/03 PHP
WordPress中的shortcode短代码功能使用详解
2016/05/17 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
PHP获取日期对应星期、一周日期、星期开始与结束日期的方法
2018/06/22 PHP
js中typeof的用法汇总
2013/12/12 Javascript
javascript:json数据的页面绑定示例代码
2014/01/26 Javascript
javascript实现类似超链接的效果
2014/12/26 Javascript
jQuery循环动画与获取组件尺寸的方法
2015/02/02 Javascript
Javascript中关于Array.filter()的妙用详解
2016/12/04 Javascript
树结构之JavaScript
2017/01/24 Javascript
前端主流框架vue学习笔记第二篇
2017/07/26 Javascript
使用Vue自定义指令实现Select组件
2018/05/24 Javascript
原生javascript自定义input[type=radio]效果示例
2019/08/27 Javascript
基于jquery ajax的多文件上传进度条过程解析
2019/09/11 jQuery
JS如何在数组指定位置插入元素
2020/03/10 Javascript
Python使用稀疏矩阵节省内存实例
2014/06/27 Python
Python常用的文件及文件路径、目录操作方法汇总介绍
2015/05/21 Python
Python Socket传输文件示例
2017/01/16 Python
对Python信号处理模块signal详解
2019/01/09 Python
Python切片操作去除字符串首尾的空格
2019/04/22 Python
澳洲在线厨具商店:Kitchen Style
2018/05/05 全球购物
Tommy Hilfiger美国官网:美国高端休闲领导品牌
2019/01/14 全球购物
德国游戏机商店:Konsolenkost
2019/12/08 全球购物
小学生我的梦想演讲稿
2014/08/21 职场文书
群众路线专项整治方案
2014/10/27 职场文书
2014年营销工作总结
2014/11/22 职场文书
离婚协议书范文
2015/01/26 职场文书
认真学习保证书
2015/02/26 职场文书
幼儿园老师个人总结
2015/02/28 职场文书
海洋天堂观后感
2015/06/05 职场文书
公司回复函格式
2015/07/14 职场文书
四年级作文之植物
2019/09/20 职场文书
总结Python常用的魔法方法
2021/05/25 Python
Linux安装Docker详细教程
2022/07/07 Servers