You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Amplify Auth实现GraphQL模型指定字段可更新的权限配置

权限配置正确性判断

你当前编写的GraphQL Schema权限配置完全符合你的业务需求,逻辑通顺无问题:

  • Recipe模型的全局@auth规则:
    • 第一条{ allow: private, operations: [read] }满足「所有已登录私有用户可读取全部字段」的要求
    • 第二条管理员组规则默认放开所有操作权限,满足管理员可修改任意字段的要求
  • totalCooked字段的单独@auth规则:给私有用户额外放开update权限,刚好实现普通用户仅可更新该字段、不能修改其他字段的需求
  • 其余User、RecipeIngredients、Ingredients三个模型的权限规则也和你描述的业务场景没有冲突。
其他可行实现方案

方案1:显式标注管理员权限范围,逻辑更直观

你可以在Recipe的全局规则里显式声明管理员的所有操作权限,和现有写法效果完全一致,只是可读性更高:

type Recipe @model @auth(rules: [
        { allow: private, operations: [read] }
        { allow: groups, groups: ["Admin"], operations: [create, read, update, delete] }
    ]){
    id: ID!
    name: String
    description: String
    totalCooked: Int @auth(rules: [{ allow: private, operations: [update] }])
    ingredients: [RecipeIngredients] @connection(name: "RecipeIngredient")
}

方案2:自定义Mutation封装更新逻辑,扩展性更强

如果后续你需要在更新totalCooked时叠加额外业务逻辑(比如给完成烹饪的用户发放金币奖励、统计用户烹饪次数),可以选择禁用普通用户对Recipe的所有update权限,单独写自定义Mutation处理「完成烹饪」操作,安全性更高:

  1. 先移除totalCooked的字段级auth规则,全局仅给管理员开放update权限
  2. 新增自定义Mutation:
type Mutation {
  markRecipeCooked(recipeId: ID!): Recipe @function(name: "markRecipeCooked-${env}") @auth(rules: [{ allow: private }])
}
  1. 配套编写对应的云函数,在云函数内校验权限后直接更新totalCooked字段即可,该方案可以完全避免普通用户直接调用GraphQL原生update接口提交恶意字段更新请求。

内容的提问来源于stack exchange,提问作者Mr. Baks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 13:54:03