mysql 密码错误次数_nodejs -- 登录接口之密码错误限制次数(含代码)

密码次数尝试,可以有效的保护用户账户安全,有了限制之后,就算用量子计算机都束手无策。

银行卡也是这种,尝试次数过多,就锁定,说不定还会自动报警。

效果图

e770b55a1e5f2a9b66ab0c7a0764f6d2.png

实现思路

数据库表设计

在表里面添加一个字段,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: '服务器错误'

})

})

})

复制代码

结束了

嘻嘻

21227f6cc63a6ea290db812d2082f0d5.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你的第一个问题是关于 node.js 和 MySQL 插入语句的语法错误提示,是吗? 首先,你需要确保你的 MySQL 语句的语法是正确的。MySQL 插入语句的基本语法如下: ``` INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...); ``` 其中,`table_name` 是你要插入数据的表的名称,`column1, column2, column3` 是你要插入的列的名称,`value1, value2, value3` 是你要插入的值。 在 node.js 中,你可以使用 `mysql` 模块来连接和操作 MySQL 数据库。下面是一个示例代码,演示如何使用 `mysql` 模块来插入数据到 MySQL 数据库中: ```javascript const mysql = require('mysql'); const connection = mysql.createConnection({ host: 'localhost', user: 'root', password: 'password', database: 'mydatabase' }); connection.connect((err) => { if (err) throw err; console.log('Connected!'); const sql = "INSERT INTO customers (name, address) VALUES ('John Doe', 'Highway 71')"; connection.query(sql, (err, result) => { if (err) throw err; console.log('1 record inserted'); connection.end(); }); }); ``` 在上面的代码中,我们创建了一个 `mysql` 连接对象 `connection`,并在连接成功后,使用 `connection.query()` 方法来执行 MySQL 插入语句。 如果你使用类似上面的代码来执行 MySQL 插入语句,但是仍然遇到语法错误提示,那么你需要检查你的 MySQL 语句是否正确。你可以尝试在 MySQL 命令行中执行你的 MySQL 语句,以确保它没有语法错误
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值