绕过猫鼬吸气剂

时间:2014-11-12 08:08:11

标签: javascript node.js mongodb mongoose

我试图在发送之前使用mongoose getter来强制转换所有用户密码。它完美地运作。 但是,在方法" comparePassword"上,我需要使用passwordstring来比较我可以进行身份​​验证的内容。

有没有办法在猫鼬的某些条件下绕过吸气剂?提前致谢!

代码示例:

function castpassword (pw) {
  return 'keyboard cat';
}

var AccountSchema = new Schema({
  password: { type: String, get: castpassword }
});

AccountSchema.methods.comparePassword = function (candidatePassword, cb) {
    // random hash vs keyborad cat === not authenticated
    crypt.compare(candidatePassword, this.password, function (err, isMatch) {
        if (err) return cb(err);
        cb(null, isMatch);
    });
};
....

Account.findById( someId, function (err, found) {
  console.log(found.password); // 'keyboard cat'
});

2 个答案:

答案 0 :(得分:2)

在mongoose中使用 this.toObject()将绕过mongoose中的所有getter和setter设置,因为它将其更改为普通JSON数据

AccountSchema.methods.comparePassword = function (candidatePassword, cb) {
    // keyboard cat vs keyboard cat === authenticated
    crypt.compare(candidatePassword, this.toObject().password, function (err, isMatch) {
        if (err) return cb(err);
        cb(null, isMatch);
    });
};

答案 1 :(得分:1)

您可以使用mongoose'lean'跳过所有猫鼬魔法,然后拔出一个json对象。

Account
  .findById(someId)
  .lean()
  .exec(function (err, found) {
    console.log(found.password); // actual password
    // you can not use mongoose functions here ex:
    // found.save() will fail
  })

另一种选择是在架构中将密码设置为'select:false'。

var AccountSchema = new Schema({
  password: { type: String, select: false }
});

这样一来,当你拿出文件的时候,密码字段根本就不会存在,除非你专门用它。

Account
  .findById(someId, function (err, found) {
    console.log(found.password); // undefinded
  })

Account
  .findById(someId)
  .select('password') // explicitly asking for password
  .exec(function (err, found) {
    console.log(found.password); // actual password
  })