1

我想在 mongoose 中创建帐户时散列我的用户密码,设置一个钩子以异步散列密码并在帐户上设置 _password 属性。

var accountSchema = new mongoose.Schema({
    name: {type : String},
    _password : {type : String}
})

accountSchema.pre('save', true, function hook (next, done) {
    next();
    doHashPassword(done);
});

var Account = mongoose.model('Account', accountSchema);

Joe = new Account({name : "Joe", password : "secret"});

Joe.save();

如何在我的哈希函数/钩子中访问 Joe 的原始参数({name:“Joe”,密码:“secret”})?因为密码没有映射到私有属性(这是为了不意外地以明文设置密码)

提前致谢

4

3 回答 3

1

我不是 100% 确定您可以访问不属于架构的原始属性。

我确实知道曾经有一个选项可以启用/禁用在数据库中保存非模式属性,所以即使发送 { name: 'Joe', password: 'secret' } 这样一个选项被禁用,或者您会不小心创建并设置“密码”。自从我调查以来已经有几个版本了,所以你可能没问题。

通常,我们不使用常规的“设置”密码,而是创建一个实例方法,例如:

var joe = new Account({ name: 'Joe' });
joe.setPassword('secret', function() {
  joe.save();
});

这具有封装密码逻辑(而不是依赖于不太明显的钩子)并使密码管理成为显式活动的良好副作用。这样的事情可能对你有用:

accountSchema.methods.setPassword = function(plain, done) {
  var self = this;
  doHashPassword(plain, function(err, result) {
    self._password = result;
    if (done) done();
  });
};

mongoose 文档有关于创建实例方法的指南:

您还可以在此一般情况下添加一些糖并使其可链接,或忽略来自 setPassword() 的回调,或将 setPassword() 更改为 savePassword(),这样您就不必担心完成后的保存...等等。很多选择。

于 2013-01-29T19:30:57.183 回答
0

您可能不想将密码以纯文本形式存储在任何地方,对吧?您可以做的是在模式上创建一个虚拟属性,该属性将立即散列密码并将其添加到模型中。

这是未经测试的,但我会做这样的事情:

var accountSchema = new mongoose.Schema({
    name: {type : String},
    _password : {type : String}
})


accountSchema.virtual('password')
    // Setting the password property will put the hashed string into _password
    .set(function(s) {
        this._password = myHashFn(s);
    })
    // If you want to have a getter, implement it here
    .get(function() {
        return "********";
    });


var Account = mongoose.model('Account', accountSchema);

Joe = new Account({name : "Joe", password : "secret"});

Joe.save();
于 2013-01-29T23:52:23.260 回答
0

我通过我的另一个问题找到了解决这个问题的方法,诺亚在其中发布了一篇关于这个主题的博文。

http://blog.mongodb.org/post/32866457221/password-authentication-with-mongoose-part-1

他们使用预保存挂钩。我错过了在我将Account的密码设置为明文密码的那一刻密码没有保存的点,它只存在于内存中。如果我调用 save 密码将被异步覆盖并在哈希成功后保存。

感谢大家的帮助

于 2013-01-30T08:13:56.390 回答