在使用MySQL的PassportJs中的多个序列化用户

正在开发使用Nodejs与MySQL的应用程序

对于使用passportJS的login身份validation。 在这个应用程序有两个loginpipe理员和另一个客户。 所以分开的表是有用户和注册。

passport.serializeUser(function(user, done) { done(null, { id : user.id, isAdmin : user.isAdmin // or some other property/check }); }); // used to deserialize the user passport.deserializeUser(function(user, done) { var table = user.isAdmin ? 'register' : 'users'; connection.query('select * from ?? where id = ?', [ table, user.id ], function(err, rows) { if (err) { return done(err); } else if (! Array.isArray(rows) || ! rows.length) { return done(); } else { return done(null, rows[0]); } }); 

});

在反序列化用户如果我login与客户ID …它与用户表检查相同的ID …所以我得到错误的数据

问题已更新: 本地loginpipe理员

 passport.use('local-login', new LocalStrategy({ // by default, local strategy uses username and password, we will override with email usernameField : 'email', passwordField : 'password', passReqToCallback : true // allows us to pass back the entire request to the callback }, function(req, email, password, done) { // callback with email and password from our form connection.query("select * from users WHERE email = '" + email + "'",function(err,rows){ if (err) return done(err); if (!rows.length) { return done(null, false, req.flash('loginMessage', 'No user found.')); // req.flash is the way to set flashdata using connect-flash } // if the user is found but the password is wrong if (!( rows[0].password == password)) return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); // create the loginMessage and save it to session as flashdata // all is well, return successful user return done(null, rows[0]); }); })); 

用户login

  passport.use('customer-login', new LocalStrategy({ usernameField : 'mobile', passwordField : 'otp', passReqToCallback : true }, function(req, mobile, otp, done) { connection.query("select * from register WHERE mobile = '" + mobile + "'",function(err,rows){ if (err) return done(err); if (!rows.length) { return done(null, false, req.flash('loginMessage', 'No user found.')); // req.flash is the way to set flashdata using connect-flash } // if the user is found but the password is wrong if (!( rows[0].otp == otp)) return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); // create the loginMessage and save it to session as flashdata // all is well, return successful user console.log(rows); return done(null, rows[0]); }); })); 

对于pipe理员使用电子邮件作为用户名login

为客户使用手机号码login

寄存器 registertable

用户 用户表

你不必序列化serializeUser中的用户标识,它也可以是一个包含(例如)pipe理状态的对象(从你的数据库内容看, cust_code只存在于普通用户,所以我们可以使用检查用户是否是pipe理员):

 passport.serializeUser(function(user, done) { done(null, { id : user.id, isAdmin : user.cust_code === undefined // this does require that `cust_code` // is defined for all regular users. }); }); 

这显然假定user文档包含反映用户是否是pipe理员的东西

deserializeUser使用该对象,您可以确定要查询哪个表:

 passport.deserializeUser(function(user, done) { var table = user.isAdmin ? 'users' : 'register'; connection.query('select * from ?? where id = ?', [ table, user.id ], function(err, rows) { if (err) { return done(err); } else if (! Array.isArray(rows) || ! rows.length) { return done(); } else { return done(null, rows[0]); } }); });