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 查询