Serialize / deserialize with multiple LocalStrategy PassportJs / ExpressJs
I am starting with PassportJs / ExpressJs application for authentication I have two different models for user and admin Here is the passport.js code
passport.use('admin', new LocalStrategy({
usernameField: 'email',
passwordField: 'password'
},
function(email, password, done) {
var adminflag = 'admin';
console.log('---------------------in admin')
db.adminUser.find({ where: { email: email }}).success(function(user) {
if (!user) {
done(null, false, { message: 'Unknown user' });
} else if (!user.authenticate(password)) {
done(null, false, { message: 'Invalid password'});
} else {
console.log('Login (local) : { id: ' + user.id + ', username: ' + user.username + ' }');
done(null, user);
}
}).error(function(err){
done(err);
});
}
));
LocalStrategy for user
passport.use('user', new LocalStrategy({
usernameField: 'email',
passwordField: 'password'
},
function(email, password, done) {
console.log('---------------------in user')
var userflag = 'user';
db.User.find({ where: { email: email }}).success(function(admin) {
if (!admin) {
done(null, false, { message: 'Unknown user' });
} else if (!admin.authenticate(password)) {
done(null, false, { message: 'Invalid password'});
} else {
console.log('Login (local) : { id: ' + admin.id + ', username: ' + admin.username + ' }');
done(null, admin);
}
}).error(function(err){
done(err);
});
}
));
so my question is how can I write serializeUser / deserializeUser for admin and user
passport.serializeUser(function(admin, done) {
if (admin.isSuperAdmin == 0 || admin.isSuperAdmin == 1 ) {
flag = true;
done(null, admin.id);
console.log('----------------------ADMIN');
}else{
flag = false;
console.log('------------------USER');
done(null, admin.id);
};
});
passport.deserializeUser(function(id ,done) {
db.User.find({where: {id: id}}).success(function(admin){
console.log('Session: { id: ' + user.id + ', username: ' + user.username + ' }');
done(null, admin);
}).error(function(err){
done(err, null);
});
});
+2
Gajanan Ghuge
source
to share
1 answer
serializeUser
is not limited to only scalar values, so you can serialize an object that contains a type (admin or normal user):
passport.serializeUser(function(user, done) {
var isAdmin = user.isSuperAdmin === 0 || user.isSuperAdmin === 1;
return done(null, { id : user.id, isAdmin : isAdmin };
});
In your deserialization function, you can check this type:
passport.deserializeUser(function(user, done) {
var collection = user.isAdmin ? db.adminUser : db.User;
collection.find({ id : user.id }, ...);
});
However, if possible, I would consider combining the two collections into one collection User
and using a flag to indicate whether the user is an administrator or not.
+3
robertklep
source
to share