【问题标题】:Multiple local strategies and isAuthenticated多种本地策略和isAuthenticated
【发布时间】:2018-03-19 08:46:02
【问题描述】:

我有两种不同的策略'login'和'adminlogin':

app.post('/login', passport.authenticate('login', {
      failureRedirect : '/login', 
      failureFlash : true 
  }), function(req, res) {
      res.redirect('/');
  });

app.post('/adminlogin', passport.authenticate('adminlogin', {
      failureRedirect : '/adminlogin', 
      failureFlash : true 
  }), function(req, res) {          
      res.redirect('/admin');
  });

adminlogin 定义为:

assport.use('adminlogin', new LocalStrategy({
    usernameField : 'uname',
    passwordField : 'password',
    passReqToCallback : true
},
function(req, uname, password, done) {

    process.nextTick(function() {

        findAdminByUserName(uname, function(err, user) {
            if (err) { 
              console.log("1- ERROR::adminlogin: ", err);
              return done(err); 
            }

            if (!user) { 
              return done(null, false, req.flash('loginMessage', 'Unknown Admin: ' + uname)); 
            }

            // Now we do the comparison
            CUtil.comparePasswords(password, user.password, user.salt, function (err, isMatch) {            
                if (err) {
                  console.log("2- ERROR::adminlogin: ", err);
                  return done(err, null);
                }
                if (!isMatch) { 
                  return done(null, false, req.flash('loginMessage','Invalid admin or password')); 
                } 
                return done(null, cleanAdminUser(user));
            });
        });
    });}));

附加以下代码:

function cleanAdminUser(pAdmin) {

if (!pAdmin)
  return null;

var newAdmin = {
  _id: pAdmin._id,
  fname: pAdmin.fname,
  lname: pAdmin.lname,
  uname: pAdmin.uname,
  role: 'admin',
};
return newAdmin;}

passport.serializeUser(function(user, done) {
done(null, user._id);});

passport.deserializeUser(function(id, done) {

findById(id, function (err, user) {
  done(err, user);
});});

我遇到的问题是,当非管理员用户登录、通过身份验证并最终重定向到用户仪表板时,会话被保持。使用 adminlogin 位会话丢失。

重定向前的管理员:

{ instance: 
   Authenticator {
     _key: 'passport',
     _strategies: { session: [Object], login: [Object], adminlogin: [Object] },
     _serializers: [ [Function] ],
     _deserializers: [ [Function] ],
     _infoTransformers: [],
     _framework: 
      { initialize: [Function: initialize],
        authenticate: [Function: authenticate] },
     _userProperty: 'user',
     _sm: SessionManager { _key: 'passport', _serializeUser: [Function: bound ] },
     Authenticator: [Function: Authenticator],
     Passport: [Function: Authenticator],
     Strategy: { [Function: Strategy] Strategy: [Circular] },
     strategies: { SessionStrategy: [Object] } },
  ***session: { user: 59f3c0d7f75cc7ef38733644 }*** }

重定向后的管理员(isAuthenticated()):

{ instance: 
   Authenticator {
     _key: 'passport',
     _strategies: { session: [Object], login: [Object], adminlogin: [Object] },
     _serializers: [ [Function] ],
     _deserializers: [ [Function] ],
     _infoTransformers: [],
     _framework: 
      { initialize: [Function: initialize],
        authenticate: [Function: authenticate] },
     _userProperty: 'user',
     _sm: SessionManager { _key: 'passport', _serializeUser: [Function: bound ] },
     Authenticator: [Function: Authenticator],
     Passport: [Function: Authenticator],
     Strategy: { [Function: Strategy] Strategy: [Circular] },
     strategies: { SessionStrategy: [Object] } },
  ***session: {}*** }

isAuthenticated 的代码:

function ensureAuthenticated(req, res, next) {
    console.log(req._passport);         
    if (req.isAuthenticated()) { 
        return next(); 
    }   
    //Passport.authenticate('adminlogin', {session: false})(req, res, next);
    //res.redirect('/login');
    res.send({loggedOut:true});}

我如何签入isAuthenticated() 使用adminlogin 的用户,因为默认行为仅检查login

【问题讨论】:

    标签: node.js passport.js passport-local


    【解决方案1】:

    基本上应用结构应该是:

    /app1
    --/index.html as well as config.js & controllers.js
    /app2
    --/index.html as well as config.js & controllers.js
    

    【讨论】:

    • 嗨,欢迎来到 SO!您能否详细说明您的答案的逻辑,而不仅仅是提供代码?
    • 基本上我想有一种方法来为多种用户类型创建多个应用程序。我要做的是为不同的角色(用户类型)创建不同的本地策略。这很容易拍。由于我对 Angular 缺乏完整的理解,困难的部分是如何基于不同的角色创建独立的应用程序。据我所知,使用角度实际上非常容易。我为每个角色(用户 || admin)创建了单独的文件结构,每个角色都有自己的 config.js 和 controllers.js,但有一个通用的 app.js、services.js 和 directives.js。
    猜你喜欢
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多