Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Sails.js中更新用户模型时更改密码_Javascript_Node.js_Sails.js_Passport.js_Bcrypt - Fatal编程技术网

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

Javascript 在Sails.js中更新用户模型时更改密码,javascript,node.js,sails.js,passport.js,bcrypt,Javascript,Node.js,Sails.js,Passport.js,Bcrypt,hashPassword(值,下一步);在beforeUpdate中,方法在更改用户模型的任何值时更改密码,尽管我没有在“param”中发送密码值。但当我为用户更改密码时,它可以正常工作 示例:当我更改当前用户的密码时,它应该更改pass、散列并存储在数据库中。但我不想在更新用户模型中的其他数据时更改密码(更改为随机密码) 编辑:立即工作,更正代码: 现在,只有在更新方法中发送password:password时,它才会更新密码(散列和存储),否则它只会更新提供的用户字段。 控制器(UserCo

hashPassword(值,下一步);在beforeUpdate中,方法在更改用户模型的任何值时更改密码,尽管我没有在“param”中发送密码值。但当我为用户更改密码时,它可以正常工作

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

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

控制器(UserController.js):

模型(User.js):

这段代码有一个问题,即每次更新用户模型(而不是更改密码),例如:displayName都会更新。用户模型中的密码已经加密,它会再次加密,旧密码将不再工作


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

据我所知,问题在于,即使您没有更改密码参数,也会通过密码参数。来的时候做一个比较怎么样。如果密码匹配,则不要重新散列密码。如果它不匹配,它被认为是一个新的密码,你继续哈希它


我自己也遇到了这个难题,我将采用这种方法

只需检查hashPassword方法是否在beforeUpdate函数中被调用,这就是问题所在,但仍在尝试解决此问题。只需在beforeUpdate函数中为value.password添加控制台消息,并检查value.password的值是多少。我尝试了console.log,似乎旧的散列密码再次被散列并存储在数据库中。使旧密码不再有效。更新时我没有传递任何密码属性,我尝试了if(values.password!==null),但仍然会被更改。
/**
* 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);
  }
});
}

};
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");
}
});

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