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

为AppSync自定义Resolver实现企业联系人Case数据权限控制

解决方案:Amplify+AppSync 企业Case数据权限校验

核心校验逻辑

解决令牌滥用问题的关键是强制从Cognito令牌提取用户身份,而非依赖前端参数,具体逻辑:

  • 从请求头的Cognito JWT令牌中解析出用户的internal_id(需提前在Cognito用户池配置custom:internal_id自定义属性)
  • 通过internal_id查询联系人表,获取该用户所属的企业ID
  • 校验用户所属企业ID与请求中casesByCompany的companyId参数是否一致,不一致则返回无权限错误
  • 校验通过后,仅返回该企业的Case数据

自定义Resolver实现步骤

1. 前置准备

  • 确保联系人表(假设表名为Contact)已创建基于internal_id的全局二级索引(GSI),命名为byInternalId
  • 确保Cognito用户池已添加custom:internal_id自定义属性,且用户注册/更新时已写入该字段

2. 替换casesByCompany的Resolver模板

直接覆盖自动生成的casesByCompany查询Resolver,使用以下VTL模板:

请求映射模板(Request Mapping Template)

# 从Authorization头解析JWT,提取用户internal_id
#set($authToken = $context.request.headers.Authorization.split(' ')[1])
#set($claims = $util.parseJWT($authToken))
#set($internalId = $claims.get('custom:internal_id'))
#set($requestedCompanyId = $context.args.companyId)

# 第一步:查询当前用户所属企业ID
{
  "version": "2018-05-29",
  "operation": "Query",
  "query": {
    "expression": "internal_id = :internalId",
    "expressionValues": {
      ":internalId": { "S": "$internalId" }
    }
  },
  "index": "byInternalId",
  "select": "SPECIFIC_ATTRIBUTES",
  "attributes": ["companyId"]
}

响应映射模板(Response Mapping Template)

# 校验用户是否存在
#if($ctx.result.items.size() == 0)
  #return($util.error("用户不存在", "USER_NOT_FOUND"))
#end

# 获取用户所属企业ID
#set($userCompanyId = $ctx.result.items[0].companyId.S)
#set($requestedCompanyId = $context.args.companyId)

# 校验企业ID匹配
#if($userCompanyId != $requestedCompanyId)
  #return($util.error("无权访问该企业的Case数据", "UNAUTHORIZED"))
#end

# 校验通过,查询目标企业的Case数据
{
  "version": "2018-05-29",
  "operation": "Query",
  "query": {
    "expression": "companyId = :companyId",
    "expressionValues": {
      ":companyId": { "S": "$userCompanyId" }
    }
  },
  "index": "casesByCompany",
  "nextToken": $util.toJson($context.args.nextToken),
  "limit": $util.toJson($context.args.limit)
}

3. 在Amplify中部署自定义Resolver

  • 打开Amplify控制台,进入对应的AppSync服务
  • 在左侧导航栏选择Queries,找到casesByCompany查询
  • 点击查询右侧的Edit Resolver按钮
  • 将默认的自动生成模板替换为上述请求/响应模板
  • 点击Save保存并部署更改

额外安全加固建议

  • 禁止前端传递身份参数:所有用户身份信息必须从Cognito令牌提取,禁止前端传入internal_id或companyId,避免篡改
  • 启用AppSync日志监控:开启CloudWatch日志,记录权限校验失败的请求,及时发现异常访问
  • 配合@auth指令:在Schema中使用@auth指令限制资源访问,与Resolver校验形成双重防护

内容的提问来源于stack exchange,提问作者Andy Beatson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:58:22