Node.js 检查用户是否按passport策略登录(不同的用户类型)

Node.js 检查用户是否按passport策略登录(不同的用户类型),node.js,authentication,express,passport.js,Node.js,Authentication,Express,Passport.js,我的数据库中有两个用户集合,我想为每个用户创建不同的登录类型,因此我在passport上为我的站点制定了两个策略(“本地用户”和“本地经理”)。 我的问题是如何检查我的应用程序中的登录用户类型(按使用的策略) 在这段代码中,passport只检查用户身份,但我想按策略检查。(例如:如果用户通过“本地管理员”登录,则显示页面) 您最好为此使用角色映射 无论如何,现在您可以使用这个概念: var passport = require('passport') , LocalStrategy = r

我的数据库中有两个用户集合,我想为每个用户创建不同的登录类型,因此我在passport上为我的站点制定了两个策略(“本地用户”和“本地经理”)。 我的问题是如何检查我的应用程序中的登录用户类型(按使用的策略)

在这段代码中,passport只检查用户身份,但我想按策略检查。(例如:如果用户通过“本地管理员”登录,则显示页面)


您最好为此使用角色映射

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

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
中启用会话,您也可以使用会话。您最好为此使用角色映射

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

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

中启用session,您也可以使用它。必须指出(并且已经在其他答案/评论中提到),您应该再次查看域的建模。用户对象可以非常简单(只是登录信息),其余的可以分解为其他模型/模式

请继续回答您原来的问题:

您可以打开用户类型。Passport没有深入到你申请的其他部分。在实际登录部分之外,不知道登录策略

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

function(request, response, next){
    request.isManager = !!(request.user && request.user['unique_prop']);
    next();
}
将其放在auth中间件之后。然后在路线中,您可以根据
request.isManager
进行切换。将其封装在中间件中也会将其从用户模型中抽象出来,并允许您在后台对其进行重构

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

希望这有助于必须指出的是(在其他答案/评论中也有提及),您应该重新审视您的领域建模。用户对象可以非常简单(只是登录信息),其余的可以分解为其他模型/模式

请继续回答您原来的问题:

您可以打开用户类型。Passport没有深入到你申请的其他部分。在实际登录部分之外,不知道登录策略

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

function(request, response, next){
    request.isManager = !!(request.user && request.user['unique_prop']);
    next();
}
将其放在auth中间件之后。然后在路线中,您可以根据
request.isManager
进行切换。将其封装在中间件中也会将其从用户模型中抽象出来,并允许您在后台对其进行重构

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



希望这有助于您为什么必须为2种类型的用户创建2个用户集合?使用
类型
字段的1个用户集合如何?我的用户太复杂了,我无法在一次使用集合中创建它们,是否有任何方法可以检查这种按使用策略?!是的,没有战略检查这回事。我建议重新构建您的模型。例如,一个
用户
集合,仅包含
用户名
密码
类型
字段,一个
普通用户
集合,其中包含一个“普通用户”的所有信息,并引用
用户
,一个
管理者
集合。。。类似的东西。很难更改,但我会这样做,谢谢你的回答:)为什么你必须为两种类型的用户创建两个用户集合?使用
类型
字段的1个用户集合如何?我的用户太复杂了,我无法在一次使用集合中创建它们,是否有任何方法可以检查这种按使用策略?!是的,没有战略检查这回事。我建议重新构建您的模型。例如,一个
用户
集合,仅包含
用户名
密码
类型
字段,一个
普通用户
集合,其中包含一个“普通用户”的所有信息,并引用
用户
,一个
管理者
集合。。。类似的东西。很难更改,但我会这样做,谢谢你的回答:)这似乎是很好的代码和解决方案,但在“isLoggedIn”函数中,它给出了未定义的值…如何在passport的会话中保存它?@pouya请检查:亲爱的Ebrahim,我决定使用角色映射,在单个表或分隔表中设置其他角色键更好吗?@pouya为
角色
设置集合,为
角色映射设置集合
在用户和角色之间建立许多关系这似乎是很好的代码和解决方案,但在“isLoggedIn”函数中,它给出了未定义的值……我如何在passport会话中保存它?@pouya请检查:亲爱的易卜拉欣,我决定为此使用角色映射,在单个表或分隔表中设置其他角色键更好吗?@pouya为
role
设置集合,为
RoleMapping
设置集合,以便在用户和角色之间建立许多关系