? ? ? ? 實(shí)現(xiàn)修改密碼,本篇文章實(shí)現(xiàn)修改密碼只考慮以下幾個(gè)方面:
? ? ? ? (1),獲取舊密碼
? ? ? ? (2),獲取新密碼
? ? ? ? (3),將獲取到的舊密碼與數(shù)據(jù)庫(kù)中的密碼進(jìn)行比對(duì)(避免修改錯(cuò)用戶)
? ? ? ? (4),新密碼與進(jìn)密碼進(jìn)行比對(duì),新密碼和舊密碼不能相同
? ? ? ? (5),將新密碼加密存入數(shù)據(jù)庫(kù)中
? ? ? ? 另外的一些點(diǎn)就不考慮了。
? ? ? ? 在我的這篇博客(Node.js: express + MySQL實(shí)現(xiàn)注冊(cè)登錄,身份認(rèn)證_express連接mysql數(shù)據(jù)庫(kù)注冊(cè)登陸_掉頭發(fā)類型的選手的博客-CSDN博客)中寫到,注冊(cè)時(shí)用到??bcryptjs? 這個(gè)包對(duì)密碼進(jìn)行加密,所以在修改密碼時(shí)也需要用到包進(jìn)行密碼的比較和對(duì)新密碼進(jìn)行加密。
? ? ? ? 從前端接收的值,id(判斷修改哪個(gè)用戶的密碼),oldPwd(舊密碼),newPwd(新密碼),會(huì)存儲(chǔ)到 req 中。
? ? ? ? 文件中寫的是修改密碼的函數(shù),路徑可以看我之前關(guān)于注冊(cè)的文章,將路徑和他的執(zhí)行函數(shù)分開編寫。便于管理。
// 修改密碼
exports.updatePassword = (req, res) => {
console.log(req);
}
? ? ? ? (1),根據(jù)id值獲取數(shù)據(jù)庫(kù)中需要修改的密碼
exports.updatePassword = (req, res) => {
console.log(req);
// 根據(jù)id查詢用戶信息
const sql = 'select * from ev_users where id=?'
// 執(zhí)行sql語(yǔ)句
db.query(sql, req.user.id, (err, results) => {
// 查詢出錯(cuò)
if (err) return res.cc(err)
// 查詢成功 但條數(shù)不等于1
if (results.length !== 1) return res.cc('用戶不存在')
console.log(results[0].password);
})
}
? ? ? ? 根據(jù)id去查詢需要修改的數(shù)據(jù),如果查詢出錯(cuò)或用戶不存在做一下處理,如果查詢成功,? ? ? ? results[0].password? 就是數(shù)據(jù)庫(kù)中存儲(chǔ)的加密后的密碼。
? ? ? ? (2),之后從 req 中獲取到的密碼和數(shù)據(jù)庫(kù)中存儲(chǔ)的密碼進(jìn)行比較,是否一致,比較可以使用??bcryptjs? 包中的一個(gè)方法(bcryptjs 是存儲(chǔ)密碼時(shí)對(duì)密碼進(jìn)行加密使用的包),compareSync方法。
exports.updatePassword = (req, res) => {
console.log(req);
// 根據(jù)id查詢用戶信息
const sql = 'select * from ev_users where id=?'
// 執(zhí)行sql語(yǔ)句
db.query(sql, req.user.id, (err, results) => {
// 查詢出錯(cuò)
if (err) return res.cc(err)
// 查詢成功 但條數(shù)不等于1
if (results.length !== 1) return res.cc('用戶不存在')
// 判斷用戶輸入的舊密碼是否正確
// 不能直接判斷 數(shù)據(jù)庫(kù)中存加密后的密碼
const compareResult = bcryptjs.compareSync(req.body.oldPwd, results[0].password)
if (!compareResult) return res.cc('舊密碼錯(cuò)誤!')
})
}
? ? ? ? 使用? bcryptjs.compareSync(req.body.oldPwd, results[0].password)? 就可以對(duì)獲取的舊密碼和數(shù)據(jù)庫(kù)中存儲(chǔ)的密碼進(jìn)行比較。相同會(huì)返回true,不同返回false。
? ? ? ? (3)將新密碼和數(shù)據(jù)庫(kù)中的密碼進(jìn)行比較,新密碼不能和原密碼相同。
第一種判斷方法
const sameCompare = bcryptjs.compareSync(req.body.newPwd, results[0].password)
if (sameCompare) return res.cc('新密碼不能和原密碼相同!')
第二種判斷方法
? ? ? ? 在注冊(cè)登錄那篇文章中寫到有兩個(gè)包,@escook/express-joi(自動(dòng)對(duì)表單數(shù)據(jù)進(jìn)行驗(yàn)證),joi(字段規(guī)則),也可以用這兩個(gè)包進(jìn)行新舊密碼的判斷。
// 導(dǎo)入定義驗(yàn)證規(guī)則的包
const joi = require('joi')
// 字符串類型,匹配正則,必輸
const password = joi.string().pattern(/^[\S]{6,12}$/).required()
exports.update_password_schema = {
body: {
// 舊密碼使用 password 這個(gè)規(guī)則
oldPwd: password,
// 新密碼不能等于舊密碼,但也得符合密碼的規(guī)則
// joi.ref('') 與括號(hào)中的值保持一致
newPwd: joi.not(joi.ref('oldPwd')).concat(password),
}
}
????????之后在路由處使用。
// 導(dǎo)入驗(yàn)證數(shù)據(jù)的中間件
const expressJoi = require('@escook/express-joi')
const { update_password_schema } = require('../schema/user')
// 重置密碼
router.post('/updatePwd', expressJoi(update_password_schema), userInfo_handler.updatePassword)
? ? ? ? 如果輸入一致的話會(huì)返回:
? ? ? ? (4)之后就可以將新密碼加密存儲(chǔ)到數(shù)據(jù)庫(kù)中。
? ? ? ? 先將新密碼加密,然后再使用? update? 語(yǔ)句將密碼存儲(chǔ)到數(shù)據(jù)庫(kù)中。這個(gè)接口所有的代碼:
// 重置密碼
exports.updatePassword = (req, res) => {
// console.log(req);
// 根據(jù)id查詢用戶信息
const sql = 'select * from users where id=?'
// 執(zhí)行sql語(yǔ)句
db.query(sql, req.user.id, (err, results) => {
// 查詢出錯(cuò)
if (err) return res.cc(err)
// 查詢成功 但條數(shù)不等于1
if (results.length !== 1) return res.cc('用戶不存在')
// 判斷用戶輸入的舊密碼是否正確
// 不能直接判斷 數(shù)據(jù)庫(kù)中存加密后的密碼
const compareResult = bcryptjs.compareSync(req.body.oldPwd, results[0].password)
if (!compareResult) return res.cc('舊密碼錯(cuò)誤!')
// 將新密碼更新到數(shù)據(jù)庫(kù)中
// 更新密碼sql語(yǔ)句
const sql = 'update users set password=? where id=?'
// 對(duì)新密碼進(jìn)行加密處理
const newPwd = bcryptjs.hashSync(req.body.newPwd, 10)
db.query(sql, [newPwd, req.user.id], (err, results) => {
// 執(zhí)行sql語(yǔ)句失敗
if (err) return res.cc(err)
// 執(zhí)行成功 但修改的條數(shù)不為1,沒有修改
if (results.affectedRows !== 1) return res.cc('修改密碼失敗')
// 修改密碼成功
res.cc('修改密碼成功', 0)
})
})
}
? ? ? ? 可以到下面鏈接獲取文章中的代碼。文章來源:http://www.zghlxwxcb.cn/news/detail-601384.html
????????鏈接: https://pan.baidu.com/s/1t7bX0Nv3kggyf7IFzEffcA 提取碼: 0000文章來源地址http://www.zghlxwxcb.cn/news/detail-601384.html
到了這里,關(guān)于Node.js: express + MySQL實(shí)現(xiàn)修改密碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!