passport.js 中的多个模型

Posted

技术标签:

【中文标题】passport.js 中的多个模型【英文标题】:Multiple models in passport.js 【发布时间】:2015-07-13 00:28:28 【问题描述】:

我的网站上有两种类型的帐户:

管理员和用户。

管理员将访问管理门户并使用凭据和 passport.js 进行身份验证。

用户将访问他的帐户。他可以列出产品...他将无法访问管理门户,但可以访问前台。

因此,总而言之,管理员帐户可以添加产品、描述、管理库存,并且用户将拥有一个帐户来购买产品(电子商务)。

现在我的问题是身份验证协议是相同的,但我的模型不同。

那么让 passport.js 验证我的两个帐户的最佳方法是什么?

我需要将模型传递给 passport.js。

我正在考虑的解决方案是:

    拥有一个用户基础模型并在我的 Admin 和 User 模型中继承该基础模型。但我不知道该怎么做。

    将我将使用的模型类型传递给 passport.js。但是该怎么做呢?

    为每个模型创建一个独立的身份验证系统。但它会使代码复杂化以完成完全相同的事情。重复,我讨厌这个。 :)

如果您有其他想法或最佳做法并能提供帮助,我将不胜感激。

谢谢,

【问题讨论】:

passport 只是“凭据是否正确”层,它不关心模型。您的处理应采用“请求进来,护照验证他们已通过身份验证,您自己的代码验证此经过身份验证的用户属于允许调用此路由的类型,然后提供适当的内容”的形式。您在某个地方存储了哪个用户属于哪种类型(例如在您的用户数据库中,每个用户都可以有一个类型标志),并在他们通过护照的身份验证检查后进行查找。 感谢您的回复。但我不明白。在我的护照中,我有: Admin.create( ... 创建管理员用户。所以我需要更改模型以创建用户 User.create( ... 有没有办法动态地做到这一点。你会有您的解决方案的代码示例吗?谢谢! 尝试阅读以下问题并回答:***.com/questions/29864213/… @Mike'Pomax'Kamermans 是正确的,护照只是难题的身份验证部分,您描述的问题与授权有关。您的 Admin 和 User 模型之间是否有任何区别,或者仅仅是权限问题?除了两种不同的模型,也许您可​​以只拥有一个具有role 属性的User 模型,并使用npmjs.com/package/connect-roles 之类的东西来确定管理员和用户可以做什么和不可以做什么。 【参考方案1】:

有什么问题?您可以在数据库中为用户存储不同的角色,例如: 1 - 管理员 2 - 主持人 0 - 用户(默认)

授权后(在这种情况下,如果需要,您可以为管理员和用户使用单一路由)您可以检查您的路由权限:

app.get('/admin/dashboard', isAdmin, function(req, res, next) 
  // you will get inside only if user is authentificated and has role of admin
  // otherwise he will be redirected to the mainpage '/'
  res.send('Hi, admin');
);

function isAdmin(req, res, next) 

    // if user is authenticated in the session, carry on
    if (req.isAuthenticated()) 
       // if user is admin, go next
       if (req.user.role == 1) 
         return next();
       
    
    res.redirect('/');

【讨论】:

我遇到的这种策略的问题是条件验证,一种用户类型的验证与另一种用户类型不同。所以现在你必须进行奇怪的条件验证,这很痛苦

以上是关于passport.js 中的多个模型的主要内容,如果未能解决你的问题,请参考以下文章

需要了解passport.js本地策略

如何使用 Passport.js 在 Node.js 中重置/更改密码?

Node.js - JWT、API:如何实现多个 Passport.js 身份验证中间件?

使用 passport.js 交换/转储会话数据

验证 Passport.js 中的访问权限/组

使用 Passport.js 和 Sails.js 注册后如何重定向到特定位置?