我们有一个使用AWS Amplify和Cognito进行用户身份验证的用例,其中将为用户赋予特定的角色以进行授权,例如“创建对象”,“删除对象”等。
现在我们有了一个新要求,即用户应该能够属于多个组织。 这意味着用户将不得不选择属于不同组织中的不同角色,例如能够在一个组织中删除而不能在另一个组织中删除(使用相同的帐户/电子邮件登录)。
由于组织数量不定,因此每个组织都不能创建组或角色(因为可能会有数百万个组)。
这可以完全使用Cognito来解决吗,还是将首选自定义编码的解决方案,而仅使用Cognito进行身份验证?
答案 0 :(得分:2)
我在https://github.com/aws-amplify/amplify-cli/issues/630中提出了对此要求可行的解决方案。它正在我的应用程序中正常工作。
是的,因为可能有很多组织,所以使用Cognito组来代表组织是不可行的。
我的解决方案的想法是拥有3个自定义模型:User
,Organization
和Membership
。这样可以在用户和组织之间建立多对多的关系:一个用户可以属于多个组织,一个组织可以雇用多个用户。
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
,其余的几乎相同。