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", password : "secret"}) の元の引数にアクセスするにはどうすればよいですか? パスワードがプライベート属性にマップされていないため (これは、誤ってパスワードを平文で設定しないようにするためです)

前もって感謝します

4

3 に答える 3

1

スキーマの一部ではない生のプロパティにアクセスできるとは 100% 確信が持てません。

ある時点で、スキーマ以外のプロパティをデータベースに保存することを有効/無効にするオプションがあったことを私は知っています。誤って「パスワード」を作成して設定してしまいます。私が調べてからいくつかのバージョンが経過しているので、大丈夫かもしれません。

通常、パスワードに通常の「set」を使用する代わりに、次のようなインスタンス メソッドを作成します。

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();
  });
};

マングースのドキュメントには、インスタンス メソッドの作成に関するガイドがあります。

この一般的なケースに砂糖を追加して連鎖可能にするか、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

この問題の解決策は、Noah がこのテーマに関するブログ投稿を投稿した別の質問で見つかりました。

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

それらは事前保存フックを使用します。アカウントのパスワードをクリアテキストのパスワードに設定した瞬間にパスワードが保存されず、メモリ内にのみ存在するという点を見逃していました。save を呼び出すと、パスワードは非同期的に上書きされ、ハッシュが成功した後に保存されます。

ご協力ありがとうございました

于 2013-01-30T08:13:56.390 に答える