详解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中文入门指南,翻译加实例,jQuery的起点教程
Jan 13 Javascript
跨浏览器的 mouseenter mouseleave 以及 compareDocumentPosition的使用说明
May 04 Javascript
密码强度检测效果实现原理与代码
Jan 04 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
Nov 04 Javascript
JS实现数组按升序及降序排列的方法
Apr 26 Javascript
vue.extend实现alert模态框弹窗组件
Apr 28 Javascript
JavaScript 跨域之POST实现方法
May 07 Javascript
vue.js编译时给生成的文件增加版本号
Sep 17 Javascript
基于Vue 服务端Cookies删除的问题
Sep 21 Javascript
微信小程序和百度的语音识别接口详解
May 06 Javascript
jQuery zTree插件快速实现目录树
Aug 16 jQuery
node.js文件操作系统实例详解
Nov 05 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
Yii CGridView用法实例详解
2016/07/12 PHP
PHP中Cookie的使用详解(简单易懂)
2017/04/28 PHP
php 数组元素快速去重
2017/05/05 PHP
PHP yield关键字功能与用法分析
2019/01/03 PHP
php实现 master-worker 守护多进程模式的实例代码
2019/07/20 PHP
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
JavaScript获取某年某月的最后一天附截图
2014/06/23 Javascript
js实现从数组里随机获取元素
2015/01/12 Javascript
vue,angular,avalon这三种MVVM框架优缺点
2016/04/27 Javascript
详解JS中遍历语法的比较
2017/04/07 Javascript
js实现移动端导航点击自动滑动效果
2017/07/18 Javascript
详解Node中导入模块require和import的区别
2017/08/11 Javascript
AngularJS 实现购物车全选反选功能
2017/10/24 Javascript
代码整洁之道(重构)
2018/10/25 Javascript
关于vue路由缓存清除在main.js中的设置
2019/11/06 Javascript
javascript实现蒙版与禁止页面滚动
2020/01/11 Javascript
JS中类的静态方法,静态变量,实例方法,实例变量区别与用法实例分析
2020/03/14 Javascript
Vue+Element自定义纵向表格表头教程
2020/10/26 Javascript
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
2018/03/19 Python
python3 实现一行输入,空格隔开的示例
2018/11/14 Python
python3实现多线程聊天室
2018/12/12 Python
Python 共享变量加锁、释放详解
2019/08/28 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
2020/04/21 Python
使用Python防止SQL注入攻击的实现示例
2020/05/21 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
2020/07/15 Python
中国电视购物:快乐购
2017/02/04 全球购物
台湾旅游网站:灿星旅游
2018/10/11 全球购物
伊莱克斯阿根廷网上商店:Tienda Electrolux
2021/03/08 全球购物
项目计划书范文
2014/01/09 职场文书
原料仓仓管员岗位职责
2014/07/08 职场文书
防灾减灾活动总结
2014/08/30 职场文书
2014年幼儿园安全工作总结
2014/11/10 职场文书
初中成绩单评语
2014/12/29 职场文书
2015年社区居委会工作总结
2015/05/18 职场文书
教师病假条范文
2015/08/17 职场文书