实现修改密码,本篇文章实现修改密码只考虑以下几个方面:
(1),获取旧密码
(2),获取新密码
(3),将获取到的旧密码与数据库中的密码进行比对(避免修改错用户)
(4),新密码与进密码进行比对,新密码和旧密码不能相同
(5),将新密码加密存入数据库中
另外的一些点就不考虑了。
在我的这篇博客(Node.js: express + MySQL实现注册登录,身份认证_express连接mysql数据库注册登陆_掉头发类型的选手的博客-CSDN博客)中写到,注册时用到 bcryptjs 这个包对密码进行加密,所以在修改密码时也需要用到包进行密码的比较和对新密码进行加密。
从前端接收的值,id(判断修改哪个用户的密码),oldPwd(旧密码),newPwd(新密码),会存储到 req 中。
文件中写的是修改密码的函数,路径可以看我之前关于注册的文章,将路径和他的执行函数分开编写。便于管理。
// 修改密码
exports.updatePassword = (req, res) => {
console.log(req);
}
(1),根据id值获取数据库中需要修改的密码
exports.updatePassword = (req, res) => {
console.log(req);
// 根据id查询用户信息
const sql = 'select * from ev_users where id=?'
// 执行sql语句
db.query(sql, req.user.id, (err, results) => {
// 查询出错
if (err) return res.cc(err)
// 查询成功 但条数不等于1
if (results.length !== 1) return res.cc('用户不存在')
console.log(results[0].password);
})
}
根据id去查询需要修改的数据,如果查询出错或用户不存在做一下处理,如果查询成功, results[0].password 就是数据库中存储的加密后的密码。
(2),之后从 req 中获取到的密码和数据库中存储的密码进行比较,是否一致,比较可以使用 bcryptjs 包中的一个方法(bcryptjs 是存储密码时对密码进行加密使用的包),compareSync方法。
exports.updatePassword = (req, res) => {
console.log(req);
// 根据id查询用户信息
const sql = 'select * from ev_users where id=?'
// 执行sql语句
db.query(sql, req.user.id, (err, results) => {
// 查询出错
if (err) return res.cc(err)
// 查询成功 但条数不等于1
if (results.length !== 1) return res.cc('用户不存在')
// 判断用户输入的旧密码是否正确
// 不能直接判断 数据库中存加密后的密码
const compareResult = bcryptjs.compareSync(req.body.oldPwd, results[0].password)
if (!compareResult) return res.cc('旧密码错误!')
})
}
使用 bcryptjs.compareSync(req.body.oldPwd, results[0].password) 就可以对获取的旧密码和数据库中存储的密码进行比较。相同会返回true,不同返回false。
(3)将新密码和数据库中的密码进行比较,新密码不能和原密码相同。
第一种判断方法
const sameCompare = bcryptjs.compareSync(req.body.newPwd, results[0].password)
if (sameCompare) return res.cc('新密码不能和原密码相同!')
第二种判断方法
在注册登录那篇文章中写到有两个包,@escook/express-joi(自动对表单数据进行验证),joi(字段规则),也可以用这两个包进行新旧密码的判断。
// 导入定义验证规则的包
const joi = require('joi')
// 字符串类型,匹配正则,必输
const password = joi.string().pattern(/^[\S]{6,12}$/).required()
exports.update_password_schema = {
body: {
// 旧密码使用 password 这个规则
oldPwd: password,
// 新密码不能等于旧密码,但也得符合密码的规则
// joi.ref('') 与括号中的值保持一致
newPwd: joi.not(joi.ref('oldPwd')).concat(password),
}
}
之后在路由处使用。
// 导入验证数据的中间件
const expressJoi = require('@escook/express-joi')
const { update_password_schema } = require('../schema/user')
// 重置密码
router.post('/updatePwd', expressJoi(update_password_schema), userInfo_handler.updatePassword)
如果输入一致的话会返回:
(4)之后就可以将新密码加密存储到数据库中。
先将新密码加密,然后再使用 update 语句将密码存储到数据库中。这个接口所有的代码:
// 重置密码
exports.updatePassword = (req, res) => {
// console.log(req);
// 根据id查询用户信息
const sql = 'select * from users where id=?'
// 执行sql语句
db.query(sql, req.user.id, (err, results) => {
// 查询出错
if (err) return res.cc(err)
// 查询成功 但条数不等于1
if (results.length !== 1) return res.cc('用户不存在')
// 判断用户输入的旧密码是否正确
// 不能直接判断 数据库中存加密后的密码
const compareResult = bcryptjs.compareSync(req.body.oldPwd, results[0].password)
if (!compareResult) return res.cc('旧密码错误!')
// 将新密码更新到数据库中
// 更新密码sql语句
const sql = 'update users set password=? where id=?'
// 对新密码进行加密处理
const newPwd = bcryptjs.hashSync(req.body.newPwd, 10)
db.query(sql, [newPwd, req.user.id], (err, results) => {
// 执行sql语句失败
if (err) return res.cc(err)
// 执行成功 但修改的条数不为1,没有修改
if (results.affectedRows !== 1) return res.cc('修改密码失败')
// 修改密码成功
res.cc('修改密码成功', 0)
})
})
}
可以到下面链接获取文章中的代码。
链接: https://pan.baidu.com/s/1t7bX0Nv3kggyf7IFzEffcA 提取码: 0000