为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
相关产品推荐
相关产品推荐

