如何防止 Mongoose 在修改用户后重新散列用户密码?
Posted
技术标签:
【中文标题】如何防止 Mongoose 在修改用户后重新散列用户密码?【英文标题】:How to prevent Mongoose from rehashing the user passwords after modifying a user? 【发布时间】:2017-09-28 03:08:18 【问题描述】:那里有很多教程,告诉在您的 userSchema 页面中使用 bycrypt。保存新用户后,它会使用加密的密码。伟大的。 然而,我想,当我用某些东西编辑用户时,它也会重新设置密码,导致无法登录。你能建议我一个解决方案吗?谢谢。
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const bcrypt = require('bcrypt-nodejs');
const eventSchema = require('./eventSchema');
const userSchema = new Schema(
email: type: String, unique: true, lowercase: true ,
password: String,
eventList: [
type: Schema.ObjectId,
ref: "event"
],
administrator: type: Boolean, default: false
);
// On Save Hook, encrypt password
// Before saving a model, run this function
userSchema.pre('save', function(next)
// get access to the user model
const user = this;
// generate a salt then run callback
bcrypt.genSalt(10, function(err, salt)
if (err) return next(err);
// hash (encrypt) our password using the salt
bcrypt.hash(user.password, salt, null, function(err, hash)
if (err) return next(err);
// overwrite plain text password with encrypted password
user.password = hash;
next();
);
);
);
userSchema.methods.comparePassword = function(candidatePassword, callback)
bcrypt.compare(candidatePassword, this.password, function(err, isMatch)
if (err) return callback(err);
callback(null, isMatch);
);
;
// Create the model class
const ModelClass = mongoose.model('user', userSchema);
// Export the model
module.exports = ModelClass;
【问题讨论】:
【参考方案1】:也许你可以检查密码是否被修改 - 使用isModified。
userSchema.pre('save', function(next)
const user = this;
if (!user.isModified('password')) return next();
bcrypt.genSalt(10, function(err, salt)
if (err) return next(err);
bcrypt.hash(user.password, salt, null, function(err, hash)
if (err) return next(err);
user.password = hash;
next();
);
);
);
【讨论】:
如果你的意思是投票,很遗憾,我还不能。我缺乏足够的声誉。对不起。 :( 谢谢,救命恩人!以上是关于如何防止 Mongoose 在修改用户后重新散列用户密码?的主要内容,如果未能解决你的问题,请参考以下文章