如何通过Amplify GraphQL字段级授权设置模型特定字段为只读
问题根因
Amplify GraphQL Transformer 采用白名单叠加的授权逻辑:
- 模型级
@auth规则首先控制当前身份是否有权限调用对应模型的增删改查操作 - 字段级
@auth规则是在模型级权限生效的基础上,进一步限制对单个字段的访问、写入权限
你当前的写法存在两个问题:
- baz字段的字段级规则仅给了Admins组读权限,普通私有用户实际上无法读取baz,不符合你“所有用户都可读取baz”的预期
- 你没有显式限制baz字段的
create、update操作权限,模型级给Admins开放了create、update操作权限后,Admins调用变更操作时默认可以写入baz字段,因为没有字段级规则拦截该操作。
解决方案
你可以通过调整字段级授权规则实现baz字段全局只读的需求,修改后的schema如下:
type Thing @model @auth( rules: [ { allow: groups groups: ["Admins"] operations: [read, create, update] } { allow: private, operations: [read]} ] ) { id: ID! foo: String bar: String baz: ID @auth( rules: [ # 给所有需要读的角色开放读权限,不开放任何写权限 { allow: groups, groups: ["Admins"], operations: [read] } { allow: private, operations: [read] } ] ) }
调整后规则逻辑:
- 所有登录用户都可以读取baz字段,符合读权限预期
- 没有任何角色拥有baz字段的
create、update操作权限,即便是Admins组成员调用createThing、updateThing时传入baz参数,也会触发授权错误,无法写入该字段 - foo、bar字段没有额外字段级规则限制,继承模型级权限,Admins可写、所有登录用户可读,符合预期。
注意事项
如果使用的是GraphQL Transformer v1版本,字段级授权逻辑存在差异,建议升级到v2版本后使用上述配置。
内容的提问来源于stack exchange,提问作者Luke Seemann
相关产品推荐
相关产品推荐

