Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 环回2个具有相同用户ID的用户类型_Mongodb_Loopbackjs - Fatal编程技术网

Mongodb 环回2个具有相同用户ID的用户类型

Mongodb 环回2个具有相同用户ID的用户类型,mongodb,loopbackjs,Mongodb,Loopbackjs,我正在尝试使用Passport为我的企业凭据准备环回,但我遇到了一些可能是我做错了的事情 首先,我有两种不同类型的用户:participant和judge。这两种模型的基础都是用户。我现在也在使用内存数据库(最终转到Mongo) 当我使用Passport示例作为基础时,我定义了3个其他模型: AccessToken 用户凭证 用户身份 当我能够使用/participants/login登录并获得一个accessToken作为回报时,一切似乎都很好。我还可以访问/participants/1很

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

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

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

  • AccessToken
  • 用户凭证
  • 用户身份
当我能够使用
/participants/login
登录并获得一个accessToken作为回报时,一切似乎都很好。我还可以访问
/participants/1
很好(登录用户的ID)

现在用同样的令牌,我也可以访问
/judgets/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}"
},
以下是
参与者的关系:

"relations": {
  "identities": {
    "type": "hasMany",
    "model": "userIdentity",
    "foreignKey": "userId"
  },
  "credentials": {
    "type": "hasMany",
    "model": "userCredential",
    "foreignKey": "userId"
  },
  "accessTokens": {
    "type": "hasMany",
    "model": "AccessToken",
    "foreignKey": "userId"
  }
},
注意我必须如何使用
“userId”
。对于
判断
来说,这些也是完全相同的。我尝试使用
“participantId”
,但每次登录时都会出现
401
错误

我还可以访问/participants/1(登录用户的ID)

现在,使用相同的令牌,我也可以访问/judgets/1!!这似乎有点冒险

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

另外,我建议不要让两个不同的模型扩展
用户
,因为这里似乎只需要在一个模型扩展用户上进行设置。如果
参与者
评委

最后,依我看,您应该知道存储库没有显示太多的活动,目前15个PR处于打开状态,用户报告各种各样的错误,但背后没有太多支持。这是一个选择的问题,但我建议直接使用
passportjs
。你会真正理解引擎盖下发生的事情,将其添加到环回应用程序实际上并不难

编辑:

如果删除环回组件,下面是我用来使用OAuth和利用环回访问控制系统的策略

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

  • UserIdentity:扩展持久化模型,属于MyUser
  • UserCredential:相同
  • MyUser:扩展用户,拥有多个用户标识,拥有多个用户凭证
从理论上讲,减少OAuth系统和环回
用户
模型之间的耦合是很好的

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

可以从给定的useridentity实例中找到用户,并使用ACL。如果一个用户确实有很多用户身份,这可能会很有趣。实际上,这似乎没有什么用处,因为如何从不同的用户身份中可靠地识别用户?(基本上,同一个用户可以拥有一个twitter帐户、一个谷歌帐户等等。但是,什么样的信息可以用来可靠地将他们链接在一起呢?几乎没有什么)

因此,我采用的方法是:

  • MyUser:扩展用户,包含字段
    provider
    provider\u id
    ,用于存储oauth身份验证提供程序的名称以及此提供程序平台上的用户id
  • UserCredentials:存储链接帐户凭据(您可以使用google帐户进行身份验证,但也可能希望链接github和bitbucket帐户)
然后,当用户通过oauth对我的平台进行身份验证时,第一次会创建一个
MyUser
实例。由于
MyUser
始终需要电子邮件和密码,因此我生成了两个:

  • 电子邮件:
    provider\u id
    @myapp.
    provider
    .com
  • 密码:加密强随机密码
这样,用户将拥有一个具有唯一电子邮件的帐户,但不能“手动”登录,只能通过OAuth登录

这是在passport的serializeUser回调(在中搜索“serialize”)中完成的,每次身份验证请求成功时都会调用该回调

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


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

这是一个很好的建议。Afaik环回中的模型不像传统OO结构中具有真正多态性的子类的类那样设计。它更像是一种扩展模型和存储后端的方式,而不是完全面向对象的javascript。当您使用
judge
模型时,它并没有真正意识到它是用户的孩子,只是它是以这种方式创建的,并在一个方向(向上)共享属性/方法。角色是不同类型用户的选择方式。感谢您的输入。由于我们在组织内使用SAML和ADF,我不得不放弃组件passport。就结构而言,我在
/boot
目录中创建了“routes\u authenticated.js”,其中包含了所有这些内容