Loopback 2具有相同userId的用户类型

时间:2016-05-16 18:54:44

标签: mongodb loopbackjs

我正在尝试使用Passport为我的企业凭据准备好Loopback,但我遇到了一些可能我做错的事情。

首先我有2种不同类型的用户:participantjudge。这两个模型都有User的基础。我现在也在使用内存数据库(最终转到Mongo)。

当我使用Passport示例作为基础时,我还定义了3个其他模型:

  • 的accessToken
  • userCredential
  • 的UserIdentity

当我能够使用/participants/login登录并获得accessToken作为回报时,一切似乎都很好。我也可以正常访问/participants/1(登录用户的ID)。

现在有了相同的标记,我也可以访问/judges/1!这似乎有点风险。现在我知道mongo我可能不会得到相同的ID,但除此之外(除非这是它应该如何工作)。

我确实尝试过混乱关系,但发现如果我在关系中做了除foreignKey: 'userId'以外的任何事情,它将无法登录。

以下是数据库的片段:

"participant": {
  "1": "{\"createdDate\":\"2016-05-16T18:37:38.956Z\",\"name\":\"Participant Weed\",\"pin\":\"N0148094\",\"awaitingTeam\":true,\"videoSigned\":false,\"password\":\"$2a$10$NgIjGMEPUvmworA/C0vTiu2lA52SQqR6QXkOwh8IfJWVJBF8izDAu\",\"email\":\"t@lm.com\",\"id\":1}",
  "2": "{\"createdDate\":\"2016-05-16T18:37:38.956Z\",\"name\":\"Other Participant Weed\",\"pin\":\"N0148094\",\"awaitingTeam\":true,\"videoSigned\":false,\"password\":\"$2a$10$joljfw98Lf.3qdnIwf55nOEotAE3Zrcr97Fe5XKPE7j1PFy5O2h5.\",\"email\":\"t2@lm.com\",\"id\":2}"
},
"judge": {
  "1": "{\"createdDate\":\"2016-05-16T18:37:38.956Z\",\"name\":\"Judge Weed\",\"pin\":\"N0148094\",\"password\":\"$2a$10$ZiCmsGos3t7UYOpSK7s3BeAIIJ9lL0XjplOghOCXp1WTfh2MOr0vS\",\"email\":\"j@lm.com\",\"id\":1}"
},

这是我participant的关系:

"relations": {
  "identities": {
    "type": "hasMany",
    "model": "userIdentity",
    "foreignKey": "userId"
  },
  "credentials": {
    "type": "hasMany",
    "model": "userCredential",
    "foreignKey": "userId"
  },
  "accessTokens": {
    "type": "hasMany",
    "model": "AccessToken",
    "foreignKey": "userId"
  }
},

请注意我必须使用"userId"judge也完全相同。我尝试使用"participantId",但每当我尝试登录时都会出现401错误。

1 个答案:

答案 0 :(得分:2)

  

我也可以访问/ participant / 1就好了(登录用户的ID)。

     

现在以同样的方式,我也能够访问/ judge / 1!这似乎有点风险。

您是否在这些端点上设置了访问控制?否则它们默认是打开的。

另外,我建议不要扩展User两个不同的模型,因为在这里你似乎只需要在扩展用户的单个模型上设置roles。如果participantjudges

之间存在互动,这样做可能会减少您必须写的关系数量

最后,IMO,你应该知道loopback-component-passport存储库没有显示很多活动,目前15公关开放,用户报告各种错误而没有太多支持。这是一个选择问题,但我建议直接使用passportjs。你真的会理解幕后发生了什么,并将它添加到一个环回应用程序实际上并不那么难。

编辑:

如果删除环回组件,我采用的策略是使用OAuth并利用环回的访问控制系统。

在环回组件设计中,有三种模型:

  • UserIdentity:扩展持久模型,belongsTo MyUser
  • UserCredential:相同
  • MyUser:扩展User,hasMany UserIdentity,hasMany UserCredential

在论文中,减少OAuth系统和环回User模型之间的耦合是很好的。

然而,在实践中,我发现这对于设置访问控制很困难。由于UserIdentity扩展了PersistedModel而非User,这意味着UserIdentity模型不能用于访问控制。例如,不可能让UserIdentity成为其他东西的$ owner。

可以从给定的useridentity实例中找到用户并使用ACL。如果用户确实可以拥有许多UserIdentity,这可能会很有趣。在实践中,这似乎并不有用,因为如何从不同的UserIdentity可靠地识别用户? (基本上,同一个用户可以拥有Twitter帐户,谷歌帐户等,但可以使用哪些信息将它们可靠地链接在一起?几乎没有任何东西)

相反,我使用的方法是:

  • MyUser:扩展用户,包含字段provider& provider_id存储oauth身份验证提供程序的名称,以及此提供程序平台上的用户ID
  • UserCredentials:存储关联的帐户凭据(您可以验证使用Google帐户,但也许您还想链接使用github和bitbucket帐户)

然后,当用户通过oauth对我的平台进行身份验证时,第一次创建MyUser实例。由于MyUser始终需要电子邮件和密码,因此我生成了两个:

  • 电子邮件:provider_id @ myapp。provider。com
  • 密码:加密强随机密码

这样,用户就会将帐户归为一个唯一的电子邮件,但无法通过OAuth手动登录"

这是在每次验证请求成功时调用的来自护照的serializeUser回调(搜索"序列化"在http://passportjs.org/docs/authenticate中)中完成的

然后,每次用户通过oauth再次进行身份验证时,手动生成Loopback令牌并将其传回响应中,这样就可以识别最终用户,并且可以利用整个LB ACL系统。

希望这有帮助,如果您有反馈,请不要犹豫