2017-07-28 5 views
1

私はシステム上のパスワードを暗号化するためにbcryptで保存前のフックを使用しています。パスワードを作成または変更するときにうまく動作します。問題は、電子メールなどの別のフィールドを変更して保存するたびに、パスワードを再暗号化しているように見えることです。Mongooseは、保存前のフックで保存するたびにパスワードを変更します。

おそらくコードで簡単に説明できます。こちらのモデルです:

const UserSchema = new Schema({ 
    email: { 
     type: String, 
     required: true, 
     lowercase: true, 
     unique: true, 
     trim: true 
    }, 
    password: { 
     type: String, 
     required: true 
    } 
}) 

フック:

UserSchema.pre('save', function(next){ 
    const user = this; 
    console.log(user); 
    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(); 
     }) 
    }) 
}); 

そしてここでは、私のコードは、電子メールアドレスを更新することです:

module.exports = function(req, res){ 
    User.findOne({ _id: req.body.user}, function(err, doc){ 
     if(err){ 
      console.log(err); 
      return; 
     } 

     doc.email = req.body.data; 
     doc.save(function(err, returnData){ 
      if (err){ 
       console.log(err); 
       return; 
      } 
      res.send(returnData); 
     }) 

    }) 
} 

だから私は最後の例ではdoc.saveを呼び出すとき電子メールアドレスは意図した通りに更新されますが、パスワードも再暗号化されます。つまり、ユーザーがログアウトすると、再度ログインすることはできません。

誰でもこの問題を回避する方法をお手伝いできますか?

答えて

1

これを試してみてください:

UserSchema.pre('save', function(next){ 
    if (!user.isModified('password')) return next(); 

    const user = this; 

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

をハハ、私はそれを考え出し私自身の答えを加えました!私は正しい答えとしてあなたの印を付けましたが、時間をとっていただきありがとうございます! – Chris

+0

ハハ、ありがとうクリス –

0

OK、私はそれを把握するために管理 - ちょうど前のセーブフックで条件付きロジックを少し必要:

UserSchema.pre('save', function(next){ 
    if(!this.isModified('password')){ 
     return next(); 
    } // Adding this statement solved the problem!! 
    const user = this; 
    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(); 
     }) 
    }) 
}); 
関連する問題