使用 passport.js LocalStrategy 再进行一次字段验证
One more field validation using passport.js LocalStrategy
我正在使用 passport.js LocalStrategy 来验证用户名和密码。但现在我还有一个要验证的字段,即 active: true/false
(用户是否处于活动状态)。下面的代码显示了用户名和密码的验证。
app.js
passport.use(new LocalStrategy({
usernameField: 'username',
passwordField: 'password'},
function(username, password, done) {
User.findOne({ name : username}, function(err, user) {
if (!user){
return done(null, false,{message: 'Incorrect username' });
}
if(user){
var validPassword = user.comparePassword(password);
if(!validPassword){
return done(null, false,{message: 'Incorrect password' });
}
}
return done(null, user);
});
}
));
router.post('/pages/auth/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (user === false) {
return res.json({
success:false,
message: info.message,
});
} else {
req.login(user, function(err) {
return res.json({
success:true,
Id:req.sessionID,
userName:req.body.username,
Email:req.user.email,
uid:req.user._id,
mobile:req.user.mobile,
});
});
}
})(req, res, next);
});
我的 collection 看起来像下面 mongoDB
{
"_id": ObjectId("57921ce8f8a10f644ababf2d"),
"name": "abc",
"email": "abc@gmail.com",
"password": "32432423#fds#yy&1233S&dr&@",
"mobile": "9886787560",
"generatedOtp": "270371",
"active": false,
"__v": NumberInt(0)
}
现在它将检查用户名和密码是否正确然后登录,否则将显示该消息。像这样我也想检查 active
字段。请帮助我。
下面的代码应该符合您的需要。
请注意,我在检查密码之前还删除了检查 if (user) { ...
,因为这不是必需的。如果 user
将是 null
/ undefined
那么你的代码将不会达到那个点,因为你第一次检查 if (!user) { ...
which returns from the function in that case .
passport.use(new LocalStrategy({
usernameField: 'username',
passwordField: 'password'},
function(username, password, done) {
User.findOne({ name : username}, function(err, user) {
if (!user){
return done(null, false,{message: 'Incorrect username' });
}
if (!user.active) {
return done(null, false, {message: 'User is inactive'});
}
var validPassword = user.comparePassword(password);
if(!validPassword){
return done(null, false,{message: 'Incorrect password' });
}
return done(null, user);
});
}
));
我正在使用 passport.js LocalStrategy 来验证用户名和密码。但现在我还有一个要验证的字段,即 active: true/false
(用户是否处于活动状态)。下面的代码显示了用户名和密码的验证。
app.js
passport.use(new LocalStrategy({
usernameField: 'username',
passwordField: 'password'},
function(username, password, done) {
User.findOne({ name : username}, function(err, user) {
if (!user){
return done(null, false,{message: 'Incorrect username' });
}
if(user){
var validPassword = user.comparePassword(password);
if(!validPassword){
return done(null, false,{message: 'Incorrect password' });
}
}
return done(null, user);
});
}
));
router.post('/pages/auth/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (user === false) {
return res.json({
success:false,
message: info.message,
});
} else {
req.login(user, function(err) {
return res.json({
success:true,
Id:req.sessionID,
userName:req.body.username,
Email:req.user.email,
uid:req.user._id,
mobile:req.user.mobile,
});
});
}
})(req, res, next);
});
我的 collection 看起来像下面 mongoDB
{
"_id": ObjectId("57921ce8f8a10f644ababf2d"),
"name": "abc",
"email": "abc@gmail.com",
"password": "32432423#fds#yy&1233S&dr&@",
"mobile": "9886787560",
"generatedOtp": "270371",
"active": false,
"__v": NumberInt(0)
}
现在它将检查用户名和密码是否正确然后登录,否则将显示该消息。像这样我也想检查 active
字段。请帮助我。
下面的代码应该符合您的需要。
请注意,我在检查密码之前还删除了检查 if (user) { ...
,因为这不是必需的。如果 user
将是 null
/ undefined
那么你的代码将不会达到那个点,因为你第一次检查 if (!user) { ...
which returns from the function in that case .
passport.use(new LocalStrategy({
usernameField: 'username',
passwordField: 'password'},
function(username, password, done) {
User.findOne({ name : username}, function(err, user) {
if (!user){
return done(null, false,{message: 'Incorrect username' });
}
if (!user.active) {
return done(null, false, {message: 'User is inactive'});
}
var validPassword = user.comparePassword(password);
if(!validPassword){
return done(null, false,{message: 'Incorrect password' });
}
return done(null, user);
});
}
));