【问题标题】:How to prevent Mongoose from rehashing the user passwords after modifying a user?如何防止 Mongoose 在修改用户后重新散列用户密码?
【发布时间】: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;

【问题讨论】:

    标签: mongoose schema


    【解决方案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();
            });
        });
    });
    

    【讨论】:

    • 如果你的意思是投票,很遗憾,我还不能。我缺乏足够的声誉。对不起。 :(
    • 谢谢,救命恩人!
    猜你喜欢
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    相关资源
    最近更新 更多