首先,我是法国人,我的英语不是很好,我会尽我所能:)
我使用PassportJs,Mongoose和Expressjs(v3.x)创建了本地身份验证。 它完美地运作。当用户被记录时,在/ account / space中,我创建了一个表单来更改当前密码(3输入:pass,newpass,newpassconfirm)。但在那之后,我不知道如何处理......
我是否必须创建另一个护照LocalStrategy才能找到我的用户并调用我的用户架构中声明的“setPassword”函数? 我可以在不使用passportjs的情况下进行此操作吗?如果可能,我如何让用户访问数据库?
以下是我的身份验证代码。
我的/登录POST(/routes/user.js)
app.post('/login', function(req, res, next) {
passport.authenticate('local-login', function(err, user, info) {
if (err) {
return next(err);
}
if (!user) {
return res.redirect('/login');
}
req.logIn(user, function(err) {
if (err) {
return next(err);
}
req.session.pseudo = user.pseudo;
return res.redirect('/');
});
})(req, res, next);
});
我的护照脚本(/script/passport.js)
passport.use('local-login', new LocalStrategy({
usernameField : 'pseudo',
passwordField : 'pass',
passReqToCallback : true // permet de passer l'objet req dans le callback
}, function (req, pseudo, pass, done) {
Users.findOne({ 'pseudo': pseudo }, function (err, user) {
if (err) {
return done(err);
}
if (!user) {
return done(null, false, req.flash('loginMessage', 'Cet utilisateur n\'existe pas.'));
}
if (!user.verifyPassword(pass)) {
return done(null, false, req.flash('loginMessage', 'Mot de passe incorrect.'));
}
return done(null, user);
});
}));
我的用户架构(/models/db_Users.js)
var mongoose = require('mongoose');
var bcrypt = require('bcrypt-nodejs');
// Schema de la collection User
var usersSchema = mongoose.Schema({
pseudo: String,
pass: String,
admin: Boolean,
},
{
collection: 'Users'
});
usersSchema.methods.generateHash = function(password) {
return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};
usersSchema.methods.verifyPassword = function(password) {
return bcrypt.compareSync(password, this.pass);
};
module.exports = mongoose.model('Users', usersSchema);
我遇到问题的/ changepass POST(/routes/users.js)
app.post('/changepass' , function (req, res, next) {
//console.log(req.body.pass, req.body.newpass, req.body.newpassconfirm);
// Should I call another passport LocalStrategy to acces to my User and set the new password here ?
res.redirect('/account');
});
如果您对我的应用结构有疑问,可以在此处找到所有项目:https://github.com/tibaldev/docu
感谢您的帮助!
答案 0 :(得分:5)
/models/db_Users.js
// bcrypt middleware
usersSchema.pre('save', function(next){
var user = this;
//check if password is modified, else no need to do anything
if (!user.isModified('pass')) {
return next()
}
user.pass = bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
next()
})
在routes / users.js中
var User = require('mongoose').model('Users')
app.post('/changepass' , function (req, res, next) {
if (newpass !== newpassconfirm) {
throw new Error('password and confirm password do not match');
}
var user = req.user;
user.pass = newpass;
user.save(function(err){
if (err) { next(err) }
else {
res.redirect('/account');
}
})
});
答案 1 :(得分:1)
你可以试试这样的事情
app.post("/update/userid", function(req, res) {
var userid = req.params.id
var username = req.session.passport.user
var newPass = req.body.password
console.log(username, userid)
User.findByUsername(username).then(function(sanitizedUser) {
if (sanitizedUser) {
sanitizedUser.setPassword(newPass, function() {
sanitizedUser.save();
res.send('password reset successful');
});
} else {
res.send('user does not exist');
}
}, function(err) {
console.error(err);
})
})