使用AWS Cognito处理多个“帐户”中的一个用户?

时间:2019-05-16 14:57:27

标签: amazon-cognito aws-amplify

我们有一个使用AWS Amplify和Cognito进行用户身份验证的用例,其中将为用户赋予特定的角色以进行授权,例如“创建对象”,“删除对象”等。

现在我们有了一个新要求,即用户应该能够属于多个组织。 这意味着用户将不得不选择属于不同组织中的不同角色,例如能够在一个组织中删除而不能在另一个组织中删除(使用相同的帐户/电子邮件登录)。

由于组织数量不定,因此每个组织都不能创建组或角色(因为可能会有数百万个组)。

这可以完全使用Cognito来解决吗,还是将首选自定义编码的解决方案,而仅使用Cognito进行身份验证?

1 个答案:

答案 0 :(得分:2)

我在https://github.com/aws-amplify/amplify-cli/issues/630中提出了对此要求可行的解决方案。它正在我的应用程序中正常工作。

是的,因为可能有很多组织,所以使用Cognito组来代表组织是不可行的。

我的解决方案的想法是拥有3个自定义模型:UserOrganizationMembership。这样可以在用户和组织之间建立多对多的关系:一个用户可以属于多个组织,一个组织可以雇用多个用户。

  • User可以包含其自己的信息。您还可以让用户拥有与cognito中相同的id,这样就可以使cognito用户与DynamoDB中存储的User对齐。
  • Organization可以包含其自己的信息。
  • Membership是至关重要的桥梁,因为它连接到两端(用户和组织),您可以在此处对角色信息进行编码。

请参阅many-to-many section,以了解Membership在AWS Amplify GraphQL转换中如何工作。

schema.graphql如下:

type User @model {
  id: ID!
  organizations: [Membership] @connection(name: "Membership_User")
}

type Organization @model {
  id: ID!
  users: [Membership] @connection(name: "Membership_Organization")
}

type Membership @model {
  id: ID!
  user: User! @connection(name: "Membership_User")
  organization: Organization! @connection(name: "Membership_Organization")
  role: Role!
}

type Role {
  canCreate: Boolean!
  canDelete: Boolean!
}

在我的github issue中,将Project视为您的Organization,其余的几乎相同。