使用多个LocalStrategy PassportJ/ExpressJ进行序列化/反序列化 [英] Serialize / deserialize with multiple LocalStrategy PassportJs / ExpressJs

查看:113
本文介绍了使用多个LocalStrategy PassportJ/ExpressJ进行序列化/反序列化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从PassportJs/ExpressJs应用程序开始进行身份验证 我有两种不同的用户和管理员模型 这是password.js代码

I am starting with PassportJs/ExpressJs application for authentication i have two different model for User and Admin Here is 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

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);
    });
  }
));

所以我的问题是我该如何为管理员和用户编写serializeUser/deserializeUser

so My Question is that 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);
        });        
});

推荐答案

serializeUser不仅限于标量值,因此您可以序列化包含类型(管理员或普通用户)的对象:

serializeUser isn't limited to just scalar values, so you can serialize an object that contains the type (admin or plain user):

passport.serializeUser(function(user, done) {
  var isAdmin = user.isSuperAdmin === 0 || user.isSuperAdmin === 1;
  return done(null, { id : user.id, isAdmin : isAdmin };    
});

在反序列化功能中,您可以检查该类型:

In your deserialize function, you can check for that type:

passport.deserializeUser(function(user, done) {
  var collection = user.isAdmin ? db.adminUser : db.User;
  collection.find({ id : user.id }, ...);
});

但是,如果可能的话,我会考虑将这两个集合合并为一个User集合,并使用一个标志来表示用户是否为管理员.

However, if possible I would consider merging those two collections into one User collection and use a flag to signify if a user is admin or not.

这篇关于使用多个LocalStrategy PassportJ/ExpressJ进行序列化/反序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆