【问题标题】:Serialize / deserialize with multiple LocalStrategy PassportJs / ExpressJs使用多个 LocalStrategy PassportJs / ExpressJs 序列化/反序列化
【发布时间】:2015-07-04 01:04:54
【问题描述】:

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

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

用户的本地策略

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

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

【问题讨论】:

    标签: node.js express passport.js


    【解决方案1】:

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

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

    在您的反序列化函数中,您可以检查该类型:

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

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

    【讨论】:

    • deserializeUser 方法进入循环没有得到回调
    • 所以用户不能反序列化?如果不是,user 对象看起来还好吗?您使用的是哪个会话存储?
    • 用户对象看起来不错,但登录后它没有得到回调
    • 你可以在下面的代码中提出建议passport.deserializeUser(function(user ,done) { if(user.isAdmin){ db.adminUser.find({where: {id: user.id}}).success(function(admin){ done(null, admin); }).error(function(err){ done(err, null); }); } else{ db.User.find({where: {id: user.id}}).success(function(user){ done(null, user); }).error(function(err){ done(err, null); }); }; });
    • 在上面的代码中我得到错误 throw er; // 未处理的“错误”事件错误:ER_PARSE_ERROR:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '1 AND adminUsers.id true LIMIT 1' 附近使用正确的语法
    猜你喜欢
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 2013-05-01
    • 2011-05-03
    • 2015-01-22
    • 1970-01-01
    相关资源
    最近更新 更多