如何通过用户自定义声明custom claims实现AWS Amplify数据访问授权
AWS Amplify 门店标识绑定与基于Shop ID的授权实现方案
问题1:Shop ID与用户的绑定方案
- 首先在Cognito用户池新增自定义用户属性
custom:shop_id,类型设置为字符串,商家用户注册、后台审核分配门店时,直接通过Cognito Admin API或者Amplify Admin UI给对应用户的custom:shop_id属性赋值对应门店ID。 - 配置Cognito预令牌生成触发器(Pre Token Generation Lambda),在用户每次申请令牌时,将
custom:shop_id属性值写入JWT令牌的自定义声明中,声明键命名为shop_id,后续所有鉴权环节可直接从令牌中读取该值,无需重复查询用户池。 - 若存在单个商家关联多个门店的场景,可将用户所属门店列表存在独立的用户元数据表中,预令牌生成时查询表数据,将门店ID数组写入
shop_id声明即可。
问题2:基于Shop ID的Datastore模型授权实现
控制台可视化创建模型时的可选授权规则是基础配置,你可以直接修改项目中的schema.graphql文件自定义授权规则,实现基于Shop ID的权限控制,步骤如下:
- 所有需要按门店隔离的模型,新增
shopID字段存储对应门店ID,作为权限匹配的依据。 - 在模型的
@auth指令中添加自定义声明匹配规则,示例代码如下:
type ShopProduct @model @auth(rules: [ # 核心规则:仅当用户JWT中shop_id声明的值与模型的shopID字段值匹配时,允许读写操作 { allow: private, provider: userPools, operations: [read, write], claim: "shop_id", match: "shopID" }, # 可按需补充其他规则,例如下方为消费者组添加商品只读权限 { allow: groups, groups: ["customers"], operations: [read] } ]) { id: ID! productName: String! price: Float! shopID: String! # 必须字段,用于匹配用户的shop_id声明 }
- 执行
amplify push更新后端配置,AppSync会自动加载该授权规则,Datastore侧无需额外配置即可自动适配权限逻辑。
- 可选优化:新增AppSync管道Resolver,在创建、更新门店相关数据时,自动从用户JWT中读取
shop_id赋值给模型的shopID字段,避免前端恶意传入其他门店ID越权操作。
内容的提问来源于stack exchange,提问作者Ali Fumagalli
相关产品推荐
相关产品推荐

