graphql - 如何使用 AppSync GraphQL 转换为双向一对多 @connection 执行字段级别 @auth?
问题描述
我试图弄清楚如何在字段级别保护一对多@connection
以@auth
防止不应允许的突变。(即:拒绝特定用户运行突变,最终以另一个用户的身份插入帖子。)
从在字段级别保护突变的示例开始:https ://aws-amplify.github.io/docs/cli/graphql#field-level-authorization
我试着做这样的事情:
type User @model @auth(rules: [{ allow: owner, ownerField: "id" }]) {
id: ID!
posts: [Post]
@connection(name: "UserPosts")
@auth(rules: [{ allow: owner, ownerField: "id" }])
}
type Post @model {
title: String!
user: User!
@connection(name: "UserPosts")
@auth(rules: [{ allow: owner, ownerField: "userPostId" }])
}
然后说已经有一个 id 的用户regular-user-id
显然我的身份验证规则不会阻止另一个用户,比如 id of:malicious-user-id
来运行这个突变:
mutation {
createPost(input:{
title:"Oh this is BAD!"
postUserId: "regular-user-id"
}) {
title
}
}
运行一个简单的查询以确保这确实发生了:
query {
getUser(id:"regular-user-id"){
posts{
items
{
title
}
}
}
}
=>
{
"data": {
"getUser": {
"posts": {
"items": [
{
"title": "Regular User title"
},
{
"title": "Oh this is BAD!"
},
]
}
}
}
}
我尝试了各种方法来解决这个问题,但找不到任何有关双向字段级身份验证的文档。我对 AppSync 还很陌生,所以我想我一定没有得到任何东西,但是这是如此常见的用例场景,我真的很惊讶没有更多关于它的文档。
一些帮助将不胜感激。
解决方案
恶意用户应该能够更新Post
标题吗?我知道这不是您问题的确切答案,因为您专注于关系领域,但是通过尝试了解如何自己做这些事情,我阅读了一些关于引入某种形式的“每个人”组的内容因此您可以为非所有者的用户定义身份验证。然后你可以对整个Post
模型进行身份验证,这样只有所有者才能更新任何字段;
type Post
@model
@auth(rules: [
{ allow: owner, ownerField: "userPostId" },
{ allow: groups, groups: ["everyone"], operations: [read] }
]) {
title: String!
user: User!
@connection(name: "UserPosts")
}
我是一个超级新手(我目前正在评估是否将它用于我正在开始的项目),所以我在这里可能完全错了。如果您确实想要一个只有参考字段具有身份验证的半开放模型,我不知道该怎么做:(
推荐阅读
- wordpress - Woocommerce:如何在管理订单页面中将自定义可靠数量添加到订单总额?
- c# - 无法使用 Autofac 注入对象
- javascript - 嵌套中继器 - 子中继器价格添加复选框单击父中继器价格
- r - 按日期范围和 ID 连接,面板数据
- arcore - ARCore 是否与 Android Instant Apps 兼容?
- javascript - 如何防止 Cloud Firestore 拆分地图键?
- linux - 什么是“内核堆栈”?
- swift - 如何查看哪个tableView在顶部
- spring-boot - springboot2 +webflux + websocket
- javascript - 当我尝试使用“$inc”运算符增加 MongoDB 数据库中的年龄参数时出现“未处理的承诺拒绝警告”