如何防止 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 在修改用户后重新散列用户密码?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止用户更改密码后阅读?

如何防止SBT重新编译修改后的.class文件?

使用 Mongoose Schema 防止字段修改

如何防止服务器响应被用户修改?

防止同时访问 Mongoose 中的文档

bcrypt 哈希究竟如何防止彩虹表查找?