详解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 关闭IE6、IE7
Jun 01 Javascript
ASP小贴士/ASP Tips javascript tips可以当桌面
Dec 10 Javascript
js打开新窗口方法整理
Feb 17 Javascript
window.location.href IE下跳转失效的解决方法
Mar 27 Javascript
jQuery窗口、文档、网页各种高度的精确理解
Jul 02 Javascript
JS实现仿京东淘宝竖排二级导航
Dec 08 Javascript
分享五个有用的jquery小技巧
Oct 08 Javascript
AngularJS实现元素显示和隐藏的几个案例
Dec 09 Javascript
利用js给datalist或select动态添加option选项的方法
Jan 25 Javascript
RxJS在TypeScript中的简单使用详解
Apr 13 Javascript
vue使用canvas实现移动端手写签名
Sep 22 Javascript
解决ant Design Search无法输入内容的问题
Oct 29 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 微信公众平台开发模式实现多客服的实例代码
2016/11/07 PHP
PHP whois查询类定义与用法示例
2019/04/03 PHP
ThinkPHP5.1验证码功能实现的示例代码
2020/06/08 PHP
可以显示单图片,多图片ajax请求的ThickBox3.1类下载
2007/12/23 Javascript
Wordpress ThickBox 添加“查看原图”效果代码
2010/12/11 Javascript
javascript截取字符串小结
2015/04/28 Javascript
vue2.0开发实践总结之疑难篇
2016/12/07 Javascript
Node.js中的http请求客户端示例(request client)
2017/05/04 Javascript
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
vue源码解析之事件机制原理
2018/04/21 Javascript
JS中的两种数据类型及实现引用类型的深拷贝的方法
2018/08/12 Javascript
vue单页面应用打开新窗口显示跳转页面的实例
2018/09/21 Javascript
详解webpack4之splitchunksPlugin代码包分拆
2018/12/04 Javascript
js微信分享接口调用详解
2019/07/23 Javascript
layui数据表格跨行自动合并的例子
2019/09/02 Javascript
vue用BMap百度地图实现即时搜索功能
2019/09/26 Javascript
javascript自定义加载loading效果
2020/09/15 Javascript
python 第三方库的安装及pip的使用详解
2017/05/11 Python
Python+Turtle动态绘制一棵树实例分享
2018/01/16 Python
python基础教程项目三之万能的XML
2018/04/02 Python
CentOS7安装Python3的教程详解
2019/04/10 Python
Django 开发调试工具 Django-debug-toolbar使用详解
2019/07/23 Python
python温度转换华氏温度实现代码
2020/12/06 Python
比利时香水网上商店:NOTINO
2018/03/28 全球购物
微软巴西官方网站:Microsoft Brasil
2019/09/26 全球购物
管理站站长岗位职责
2013/11/27 职场文书
幼儿园教师备课制度
2014/01/12 职场文书
七年级生物教学反思
2014/01/30 职场文书
设计师个人求职信范文
2014/02/02 职场文书
数控技术专业毕业自荐书范文
2014/02/05 职场文书
先进工作者获奖感言
2014/02/08 职场文书
业务员岗位职责
2015/02/03 职场文书
党委工作总结2015
2015/04/27 职场文书
死亡诗社观后感
2015/06/05 职场文书
幼儿园大班教师随笔
2015/08/14 职场文书
Python激活Anaconda环境变量的详细步骤
2021/06/08 Python