/**
* 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(值,下一个);在beforeUpdate方法中,在更改用户模型的任何值时更改密码,但我不在'param'中发送密码值。但是当我为用户更改密码时,它可以正常工作。
示例:当我更改当前用户的密码时,应该更改pass,哈希并存储在数据库中。但是当我在用户模型中更新其他数据时,我不希望密码被更改(更改为随机密码)。
编辑:立即工作,更正代码: 现在,只有在Update方法中发送密码:密码时,它才会更新密码(哈希和存储),否则只会更新提供的用户字段。
Controller(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();
}
},
答案 0 :(得分:1)
beforeUpdate: function(values, next) {
if (values.password) {
hashPassword(values, next);
}
此代码的问题是每次更新用户模型(而不是密码更改),例如:displayName已更新。用户模型中的密码已加密,再次加密,旧密码不再有效。
解决方法是在正常更新之前从用户模型中删除密码属性(不更改密码)。在密码更改期间,必须将新密码设置为user.password并调用update。
答案 1 :(得分:0)
据我所知,问题是即使您没有更改密码,也会获得密码参数。当它到达时,如何对它进行bcrypt.compare。如果它匹配,则不要重新哈希密码。如果它不匹配它被认为是一个新密码,你继续哈希吗?
我自己就有这个难题而且我会采用这种方法。