在Sails.js中更新用户模型时密码被更改

/** * User.js * * @description :: TODO: You might write a short summary of how this model works and what it represents here. * @docs :: http://sailsjs.org/#!documentation/models */ var bcryptjs = require('bcryptjs'); function hashPassword(values, next) { bcryptjs.hash(values.password, 10, function(err, hash) { if (err) { return next(err); } values.password = hash; next(); }); } module.exports = { connection: 'mysql', attributes: { id:{ primaryKey: true, autoIncrement: true, unique: true }, displayname:{ type: 'STRING', required: true }, password:{ type: 'STRING', required: true }, // Override toJSON instance method to remove password value toJSON: function() { var obj = this.toObject(); delete obj.password; return obj; }, }, // Lifecycle Callbacks beforeCreate: function(values, next) { hashPassword(values, next); }, beforeUpdate: function(values, next) { if (values.password) { hashPassword(values, next); } else { //IMPORTANT: The following is only needed when a BLANK password param gets submitted through a form. Otherwise, a next() call is enough. User.findOne(values.id).done(function(err, user) { if (err) { next(err); } else { values.password = user.password; next(); } }); } }, validPassword: function(password, user, cb) { bcryptjs.compare(password, user.password, function(err, match) { if (err) cb(err); if (match) { cb(null, true); } else { cb(err); } }); } }; 

hashPassword(values,next); 在beforeUpdate方法改变密码,同时改变用户模型的任何值,虽然我不发送密码值的'参数'。 但是,当我更改用户的密码时,它工作正常。

示例:当我更改当前用户的密码时,应该更改密码,将其散列并存储在数据库中。 但是当我更新用户模型中的其他数据时,我不想让密码更改(更改为随机密码)。

编辑:立即工作,更正了代码: 现在,只有当您在Update方法中发送密码:密码时,它才会更新密码(散列和存储),否则它只会更新提供的用户字段。

控制器(UserController.js):

 updateDisplayName: function(req, res) { var userid = req.token; var newDisplayName = req.param('newdisplayname'); User.update({id: userid},{displayname: newDisplayName}).exec(function afterwards(err,updated){ if (err) { res.json(err); } else { res.json("Success"); } }); }, 

模型(user.js的):

 beforeUpdate: function(values, next) { if(values.password) { hashPassword(values, next); } else { next(); } }, 

 beforeUpdate: function(values, next) { if (values.password) { hashPassword(values, next); } 

这个代码的问题是每次更新用户模型(而不是密码更改)例如:displayName被更新。 用户模型中的密码已经被encryption,再次被encryption,旧的密码不会再工作。

解决方法是在正常更新之前从用户模型中删除密码属性(不更改密码)。 在密码更改期间,必须将新密码设置为user.password,并且应该调用更新。

据我所看到的问题是,即使你没有改变它,你会得到密码参数。 如何在它到达时做一个bcrypt.compare。 如果匹配,则不要重新密码。 如果它不匹配,它被认为是一个新的密码,你继续哈希呢?

我自己有这个难题,我正在采取这种方法。