AWS Amplify with GraphQL - 按不同类型的用户定义身份验证规则

Posted

技术标签:

【中文标题】AWS Amplify with GraphQL - 按不同类型的用户定义身份验证规则【英文标题】:AWS Amplify with GraphQL - Defining authentication rules by different types of users 【发布时间】:2021-01-23 10:47:59 【问题描述】:

使用 Amplify、GraphQL、AppSync、Cognito、DynamoDB

具有以下模型:

type Post
@model

  id: ID!
  content: String!
  author: String!

我希望我的规则能够启用以下情况:

    只有管理员用户可以创建、更新和删除帖子 一些只有高级用户才允许阅读的帖子 所有登录用户都允许阅读的一些帖子 所有用户(也未经身份验证)都允许阅读的一些帖子

使用上述工具实现它的最佳方法是什么?

谢谢

【问题讨论】:

您可以添加您正在使用的数据存储吗?您在使用 DynamoDB 吗? AppSync/GraphQL - Lambda 背后还有什么?完成您正在尝试做的事情的一种方法:创建 Cognito 角色并仅授予该角色权限以执行不同用户的 Lambda。 谢谢。我将编辑我的问题。我正在使用 DynamoDB,还没有任何 Lambda 函数,但打算添加。 【参考方案1】:

从您的问题来看,尚不清楚您如何定义“一些帖子”以及如何区分它们。如果我正在设计这个,我的Post 类型中至少还有一个字段来管理访问级别(例如:3(管理员)> 2(高级)> 1(登录)> 0(未注册) ),像这样;

type Post
@model

  id: ID!
  content: String!
  author: String!
  accessLevel: Int!

要在用户级别进行管理,我认为最好的办法是使用 Cognito 组进行管理(如 official documentation 中所述)并为每个组分配适当的权限。

您在 Cognito 中需要的东西:

    一个用户pool,将包含您所有的注册用户。

    高级会员的用户

    您的管理员的用户

您在 AppSync 中需要的东西:

    供管理员用户创建、更新和删除帖子:

    type Mutation 
       createPost(id:ID!, content:String!, author:String!):Post!
       @aws_auth(cognito_groups: ["Admin"])
       updatePost(id:ID!, content:String!, author:String!):Post!
       @aws_auth(cognito_groups: ["Admin"])
       deletePost(id:ID!, content:String!, author:String!):Post!
       @aws_auth(cognito_groups: ["Admin"])
    
    

    对于某些只有高级登录未注册用户可见的帖子:

    type Query 
       getPost(id:ID!):Post!
       @aws_api_key @aws_cognito_user_pools
    
    

    此外,您可以在解析器中使用accessLevel,根据您希望对高级用户、登录用户或未注册用户可见的帖子过滤掉结果。

【讨论】:

非常感谢您的详细解答。它的第一部分对我帮助很大。我在上面分享了我的完整解决方案。我很想看看你对此的看法..【参考方案2】:

我使用了@Myz 的答案。 和https://aws.amazon.com/blogs/mobile/graphql-security-appsync-amplify/ 以获得完整的解决方案:

  type Post
  @model
  @auth(
    rules: [
       allow: owner 
       allow: groups, groups: ["Admin"], operations: [create, update, delete] 
       allow: groups, groupsField: "group", operations: [read] 
    ]
  ) 
  id: ID!
  content: String!
  author: String!
  group: [String] # or String for a single group

【讨论】:

以上是关于AWS Amplify with GraphQL - 按不同类型的用户定义身份验证规则的主要内容,如果未能解决你的问题,请参考以下文章

使用 AWS Amplify/AppSync 的嵌套 GraphQL 突变

AWS Amplify 未生成正确的 graphql 输入深度

如何在 aws amplify 中使用 graphQL 限制

@connection 上的 AWS Amplify Graphql 查询

通过 GraphQL 键检索 AWS Amplify DataStore 记录

aws amplify graphql 计算域内联解析器