Goodmorning的家伙, 我正在实现NodeJs功能来重置特定用户的密码。 我使用以下模式将所有用户保存在名为Account的本地MongoDb集合中:
var Account = new Schema({
username: {
type: String,
trim: true,
unique: true,
index: true,
lowercase: true,
"default": "",
validate: [validateLocalStrategyProperty, "Please fill in your email"],
match: [/.+\@.+\..+/, "Please fill a valid email address"]
},
password: {
type: String,
"default": "",
validate: [validateLocalStrategyPassword, "Password should be longer"]
},
role: {
type: [
{
type: String,
"enum": [
C.ROLE_SUPERADMIN,
C.ROLE_ADMIN,
C.ROLE_USER
]
}
],
"default": [C.ROLE_ADMIN]
},
registrationDate: {
type: Date,
"default": new Date
}
});
因此,当一个新用户在系统中注册时,我将保存到数据库并使用PassportJS验证他的数据,如下所示:
// Post registration
userController.doRegister = function(req, res) {
Account.register(new Account({username : req.body.username, password: req.body.password, role: req.body.role}), req.body.password, function(err, user) {
if (err) {
req.flash('error', 'Error: ' + err.message);
return res.render('login/register', { roles: roles , title: 'Register'});
}
passport.authenticate('local')(req, res, function () {
req.session.save(function (err) {
if (err) {
req.flash('error', 'Error: ' + err.message);
return next(err);
}
console.log("NEW USER" + "\n Email:" + req.user.username + "\n Psw: " + req.user.password + "\n Role: " + req.user.role);
res.redirect('/login');
});
});
});
};
// Post login
userController.doLogin = function(req, res, err) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err); } //error exception
// user will be set to false, if not authenticated
if (!user) {
req.flash('error', 'Error: ' + info.message);
res.render('login/login', { title : 'Login'});
} else {
// if user authenticated maintain the session
req.logIn(user, function() {
// do whatever here on successful login
req.session.save(function (err) {
if (err) {
req.flash('error', 'Error: ' + err.message);
return res.render('login/login');
}
console.log("LOGGED IN USER" + "\n Email:" + req.user.username + "\n Psw: " + req.user.password + "\n Role: " + req.user.role);
res.redirect('/');
});
})
}
}
)(req, res, function () {});
};
直到现在一切顺利并且运作良好。 我现在正在编写一个函数来重置用户的密码,这是方法:
// PUT user password
panelController.resetProfile = function(req, res) {
Account.findOne({_id: req.params.id}, function(err, user) {
if (!user) {
req.flash('error', 'Error: user not found.');
return res.redirect('/' + req.params.redirect);
}
console.log("BEFORE USER: " + user.username + ' PSW: ' + user.password);
user.password = 'admin';
user.save(function(err) {
req.flash('info', 'Info: ' + user.username + '\'s password has been reset to \'admin\'.');
console.log("AFTER USER: " + user.username + ' PSW: ' + user.password);
res.redirect('/' + req.params.redirect);
});
});
};
显然,它可以查看控制台输出和数据库集合。事实上。假设我们要将密码重置为' admin'是test@test.com,他目前的密码是' qwerty'。在我调用这些方法后,控制台输出是:
BEFORE USER: test@test.com PSW: $2a$10$gWNJTJW63sddcF9QGXAfKuDBmG.0S6WoH/VD4CGgC8BfyBPNvYJty
AFTER USER: test@test.com PSW: $2a$10$PULutMVzQPnShuZ5ae3T4edhvdoKKHBIwDXyQ5YfAIoONtJdQDTim
如您所见,哈希密码已更改,数据库中的密码字段也已更改。 问题是,当我尝试使用用户test@test.com使用新密码' admin'登录系统时,系统会给我一个错误,说明密码不正确,当我尝试使用旧密码登录' qwerty'它让我进来。看起来它重置了密码,但系统保留了匹配的旧密码。 我错了吗?
如果您需要更多信息,请告诉我,谢谢!