NodeJS 更新用户 Bcrypt - 密码不会被散列
NodeJS Updating User Bcrypt - Password doesn't get hashed
我正在尝试使用 bcrypt-nodejs 模块为 Node.JS 应用程序的用户配置文件设置更新功能,并使用散列密码。它在登录时有效,但是当我更新配置文件时,它会使用纯文本更新用户对象(即:我输入 "text" 作为密码,数据库显示 "text")。我想在更新配置文件时散列密码。我将如何解决这个问题?
下面是我的控制器代码:
exports.editUser = function(req, res) {
// user edit form set to findonendupdate
User.findByIdAndUpdate({ _id: req.params.user_id, randString: req.body.randString }, req.body, function(err, user) {
if (err)
res.send(err);
res.json({ data: user });
});
};
作为参考,这是适用于新用户注册的用户模型代码:
passport.use('local', new LocalStrategy(
function(username, password, callback) {
User.findOne({ username: username } , function (err, user) {
if (err) { return callback(err); }
// No user found with that username
if (!user) { return callback(null, false); }
// Make sure the password is correct
user.verifyPassword(password, function(err, isMatch) {
if (err) { return callback(err); }
// Password did not match
if (!isMatch) { return callback(null, false); }
// Success
return callback(null, user);
});
});
}
));
User.findByIdAndUpdate({...}, req.body, function(err,...
在这里,您在 req.body
中收到密码,并告诉它直接更新密码(纯文本)。
你需要对其进行哈希处理然后更新
// retrieve the password field
var password = req.body.password
// update it with hash
bcrypt.hash(password, (hash) => {
req.body.password = hash
// then update
User.findByIdAndUpdate({...}, req.body, function(err,... // then update
});
我刚刚通过在更新密码之前将纯文本密码转换为散列密码来解决。
req.body.password = await bcrypt.hash(req.body.password, 8);
await Admin.findOneAndUpdate({ _id: req.body._id }, req.body, { new: true }, (err, doc) => {
if (!err) {
req.flash('success', 'Admin Updated successfully!');
res.status(201).render('admin-views/admin/edit_admin', { success_message: req.flash('success'), admin: doc });
}
else {
res.render("admin-views/admin/edit_admin", {
admin: req.body
})
}
})
希望这段代码有效!
我正在尝试使用 bcrypt-nodejs 模块为 Node.JS 应用程序的用户配置文件设置更新功能,并使用散列密码。它在登录时有效,但是当我更新配置文件时,它会使用纯文本更新用户对象(即:我输入 "text" 作为密码,数据库显示 "text")。我想在更新配置文件时散列密码。我将如何解决这个问题?
下面是我的控制器代码:
exports.editUser = function(req, res) {
// user edit form set to findonendupdate
User.findByIdAndUpdate({ _id: req.params.user_id, randString: req.body.randString }, req.body, function(err, user) {
if (err)
res.send(err);
res.json({ data: user });
});
};
作为参考,这是适用于新用户注册的用户模型代码:
passport.use('local', new LocalStrategy(
function(username, password, callback) {
User.findOne({ username: username } , function (err, user) {
if (err) { return callback(err); }
// No user found with that username
if (!user) { return callback(null, false); }
// Make sure the password is correct
user.verifyPassword(password, function(err, isMatch) {
if (err) { return callback(err); }
// Password did not match
if (!isMatch) { return callback(null, false); }
// Success
return callback(null, user);
});
});
}
));
User.findByIdAndUpdate({...}, req.body, function(err,...
在这里,您在 req.body
中收到密码,并告诉它直接更新密码(纯文本)。
你需要对其进行哈希处理然后更新
// retrieve the password field
var password = req.body.password
// update it with hash
bcrypt.hash(password, (hash) => {
req.body.password = hash
// then update
User.findByIdAndUpdate({...}, req.body, function(err,... // then update
});
我刚刚通过在更新密码之前将纯文本密码转换为散列密码来解决。
req.body.password = await bcrypt.hash(req.body.password, 8);
await Admin.findOneAndUpdate({ _id: req.body._id }, req.body, { new: true }, (err, doc) => {
if (!err) {
req.flash('success', 'Admin Updated successfully!');
res.status(201).render('admin-views/admin/edit_admin', { success_message: req.flash('success'), admin: doc });
}
else {
res.render("admin-views/admin/edit_admin", {
admin: req.body
})
}
})
希望这段代码有效!