只有在满足某些条件时才需要加密密码。
beforeUpdate: function (value, cb) {
User.findOne(value.id)
.exec(function (err, originalUser) {
if (err || !originalUser) {
return cb();
}
//encrypt the password only if the password is not previously encrypted
if (value.password != originalUser.password) {
//encrypt the Pwd
} else {
cb();
}
});
} 问题是,值对象只包含更新参数,如何在值对象中获取整个用户对象?
答案 0 :(得分:5)
更新async后,此方法不再起作用。
您无法在beforeUpdate
内获取整个对象。你可以试试这个来获取id。
var id= this.update.arguments[0]
答案 1 :(得分:2)
为了扩展user3036010的建议,我最终创建了一个像这样的新政策:
在api/policies/propagateId.js
:
module.exports = function(req, res, next) {
var id = req.param('id');
if (id && req.body) {
req.body.id = id;
}
next();
};
然后设置api/config/policies.js
文件以默认将策略应用于所有控制器和操作:
module.exports.policies = {
'*': 'propagateId'
};
这样做会强制在文档正文中设置id
属性,这会使更新操作变得认为手动指定了id
。无论出于何种原因,更新操作中都有一段代码检查,如果id
未手动指定,则会将其从值中删除。
这有点滥用政策,但似乎对我来说很好。如果您不想这样做,看起来每次发布更新API请求时,请在您的请求正文中手动指定id
。
答案 2 :(得分:1)
我不确定您为什么需要在此处的值对象中使用此功能,但您可以创建一个自定义策略来获取整个用户对象并发送' next()'回调更新;
答案 3 :(得分:1)
只需使用lodash即可使用originalUser扩展值。或者对于这个用例,如果使用节点bcrypt或其他东西,你总是可以检查密码是否已经过哈希
答案 4 :(得分:1)
现在,只有在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();
}
},
答案 5 :(得分:1)
我也尝试做类似的事情:将密码保存到相关的护照记录中。我正在使用sails-auth和sails-permissions模块,其中包括护照。
我终于能够通过使用afterValidate lifecycle callback而不是beforeUpdate回调来实现。在afterValidate回调中,您可以使用this.user
访问用户模型。
这是我在afterValidate回调中输入的代码,其中我保存了使用Passport模型传入的密码:
afterValidate: function(updates, next) {
// Update the passport password if it was passed in
if(updates.password) {
Passport.update({user: this.user.id}, {password: updates.password}).exec(function(err, passport) {
next(err);
});
}
else {
next();
}
}