gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:58:25 24 4
gpt4 key购买 nike

/**
* 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 方法中,在更改用户模型的任何值时更改密码,尽管我没有在“param”中发送密码值。但当我更改用户密码时它工作正常。

示例:当我更改当前用户的密码时,它应该更改密码、散列并存储在数据库中。但当我更新用户模型中的其他数据时,我不希望更改密码(更改为随 secret 码)。

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

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

最佳答案

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

此代码存在以下问题:每次更新用户模型(而不是更改密码)时,例如:更新 displayName。用户模型中的密码已经加密,它会再次加密,旧密码将不再起作用。

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

关于javascript - 在 Sails.js 中更新用户模型时密码被更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28393254/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com