Amplify GraphQL DataStore动态组认证groupsField失效求助
排查与解决步骤
1. 清除DataStore本地缓存
DataStore会缓存本地数据,可能之前的无权限数据仍留存缓存中,导致你看到的是旧数据。可以通过以下方式处理:
- 移动端直接卸载重装App
- 在代码中调用
DataStore.clear()方法,之后重新触发同步
2. 明确认证规则的操作范围
你的@auth规则未指定operations,默认允许所有操作,但明确指定操作类型能避免潜在的规则模糊问题,修改模型如下:
type Thing @model @auth(rules: [ { allow: groups, groupsField: "tenant", operations: [read] } ]) { id: ID! tenant: String @default(value: "admin") }
修改完成后重新部署API与DataStore模型。
3. 验证AppSync resolver逻辑
动态组认证的核心依赖AppSync生成的resolver,可通过AppSync控制台手动校验:
- 获取目标用户的JWT令牌,在查询Headers中添加
Authorization: Bearer <令牌内容> - 执行
listThings查询,检查返回结果是否仅包含对应用户cognito:groups中tenant的记录
- 若此处返回正确,问题大概率在DataStore同步配置;若仍返回所有数据,需重新部署模型确保CLI生成的resolver逻辑正确
4. 升级Amplify CLI到稳定版
旧版本CLI可能存在动态组认证的已知bug,先升级CLI:
npm install -g @aws-amplify/cli
再重新推送模型:
amplify push
5. 检查DataStore初始化配置
确保未通过自定义syncExpression覆盖认证规则的过滤逻辑,比如不要写类似以下代码:
// 错误示例:会跳过认证规则的权限校验 DataStore.configure({ syncExpression: (model) => model.id.ne(null) });
让DataStore默认使用@auth规则的过滤逻辑即可,无需额外自定义同步表达式。
6. 确认Cognito用户groups字段格式
确保用户的cognito:groups是数组类型且包含正确的tenant字符串,可通过代码打印验证:
Auth.currentAuthenticatedUser().then(user => { console.log(user.signInUserSession.idToken.payload['cognito:groups']); });
确认输出为类似["your-tenant"]的数组格式,而非字符串或其他异常格式。
内容的提问来源于stack exchange,提问作者Cari
相关产品推荐
相关产品推荐

