问题描述
我必须为用户实现一项功能,该用户可以在登录后将密码更改为新密码。
为此,我想为新密码集更新hash
和salt
的值。我怎样才能做到这一点?
自注册以来,我第一次在mongoDB中以哈希和盐形式保存密码。
我现在如何更新呢?
这是我尝试用于密码更改的代码:
router.get('/api/changePassword',function(req,res,next){
req.checkBody('oldPass','Empty Password').notEmpty();
req.checkBody('newPass','Password do not match').equals(req.body.confirmPassword).notEmpty();
var user = new User();
user.setPassword(req.body.newPass);
user.save(function (err,data) {
if (err) {
res.render('register',{errorMessages: err});
} else {
console.log("password set successfully");
}
})
})
但是在这里,我怀疑它是否会更新到现有用户的数据库中,因为我将在此处再次创建对象用户并保存它。它将在Collections中再次创建一个新用户并为此更新哈希值和salt值吗?然后如何更新现有的用户密码哈希值和盐值?
userSchema.methods.setPassword = function(password) {
this.salt = crypto.randomBytes(16).toString('hex');
this.hash = crypto.pbkdf2Sync(password,this.salt,1000,64,'sha1').toString('hex');
};
userSchema.methods.validPassword = function(password) {
var hash = crypto.pbkdf2Sync(password,'sha1').toString('hex');
return this.hash === hash;
};
module.exports = mongoose.model('User',userSchema);
这是注册页面的路由代码,这是用户首次注册并输入密码时的代码:
router.route('/register')
.get(function(req,next) {
res.render('register',{ title: 'Register a new account'});
})
.post(function(req,next) {
req.checkBody('name','Empty Name').notEmpty();
req.checkBody('email','Invalid Email').isEmail();
req.checkBody('location','Empty Location').notEmpty();
req.checkBody('password','Empty Password').notEmpty();
req.checkBody('password','Password do not match').equals(req.body.confirmPassword).notEmpty();
var errors = req.validationErrors();
if (errors) {
res.render('register',{
name: req.body.name,email: req.body.email,location:req.body.location,errorMessages: errors
});
} else {
var user = new User();
user.name = req.body.name;
user.email = req.body.email;
user.location = req.body.location;
user.setPassword(req.body.password);
user.save(function (err,{errorMessages: err});
} else {
console.log("user saved successfully");
}
})
解决方法
对不起,我先前的解释不正确,因此我将以此为答案。实际上,您将无法单独在方法中访问User对象,因此您需要执行的操作如下:
使用User.find()
创建一个返回用户的函数。
然后将该用户作为参数传递给您在上面的注释中所述的您创建的新方法,并继续.update()
作为参数传递给setPassword()
方法的该用户。
因此您的架构方法应为:
createPassword()
validPassword()
setPassword()
,您的代码中实际具有使用这些方法设置此数据的功能的部分应类似于:
function findUser() {
return User;
}
function setPassword(password) {
User.setPassword(User,password,passwordValid /*This is a boolean*/)
}