检查用户是否通过护照登录策略(不同的用户类型)

时间:2016-12-19 19:16:02

标签: node.js authentication express passport.js

我的数据库中有两个用户集合,我想为每个用户设置不同的登录类型,所以我为我的网站制定了两种护照策略('本地用户'&&#39 ;地方经理')。 我的问题是如何在我的应用程序中检查登录的用户类型(通过使用的策略)?

在此代码中,护照只检查用户身份验证,但我想通过策略进行检查。 (例如:如果用户通过' local-manager'登录,则显示页面)

function isLoggedIn(req, res, next){
    if (req.isAuthenticated()) {
        next();
        return;
    }
    res.redirect('/login');    
}

2 个答案:

答案 0 :(得分:2)

最好使用角色映射。

无论如何,你现在可以使用这个概念:

var passport = require('passport')
  , LocalStrategy = require('passport-local').Strategy;

passport.use(new LocalStrategy(
  {passReqToCallback: true},
  function(req, username, password, done) {
     req.usedStrategy = 'local-user';
     //do auth stuff
    });
  }
));

并像这样使用:

function isLoggedIn(req, res, next){
    if (req.isAuthenticated() && req.usedStrategy === 'local-user') {
        next();
        return;
    }
    res.redirect('/login');

}

如果您在passport中启用会话,也可以使用会话。

答案 1 :(得分:0)

必须说(并且已经在其他答案/评论中)您应该再次看一下您对域的建模。用户对象可以非常简单(只是登录信息),其余的可以分解为其他模型/模式。

无论如何回答你原来的问题:

您可以开启用户类型。 Passport与您的应用程序的其余部分相距甚远。登录策略在实际登录部分之外是未知的。

您可以将其作为中间件处理,并通过检查其中一个模型中的唯一属性向请求对象添加一些额外信息:

function(request, response, next){
    request.isManager = !!(request.user && request.user['unique_prop']);
    next();
}

在auth中间件之后放置它。然后在您的路线中,您可以根据request.isManager进行切换。将其封装在中间件中也会将其从用户模型中抽象出来,并允许您在后台重构它。

如果您使用mongoose,另一种方法是将函数作为静态/方法/虚拟(取决于实现)添加到模式中。

希望这会有所帮助如果您有其他问题可以随意添加评论,我可以修改答案。