AWS Amplify GraphQL 按动态 Cognito 用户组筛选
AWS Amplify GraphQL filter by dynamic Cognito User Group
给定以下 AWS Amplify GraphQL 架构 (schema.graphql
):
type Organization
@model
@auth(rules: [
{ allow: groups, groups: ["Full-Access-Admin"], mutations: [create, update, delete], queries: [list, get] },
{ allow: owner },
{ allow: groups, groupsField: "orgAdminsCognitoGroup", mutations: null, queries: [list, get] }
]) {
id: ID!
name: String!
address: String!
industry: [String]!
owner: String
orgAdminsCognitoGroup: String
}
我可以通过以下过滤掉除属于当前认证用户的组织之外的所有组织:
res = await API.graphql(graphqlOperation(listOrganizations, {
// todo: filter by owner OR by is org admin
filter: {
owner: {
eq: this.props.currentUser.username
}
}
}));
但无论如何也可以通过 orgAdminsCognitGroup
进行过滤,这是 Cognito 中属于该组织的动态组吗?我没有发现任何成功尝试使用额外的 @model
来帮助 @auth
规则来保护每个实体。
所以,问题是要过滤用户是其所有者或在 'orgAdminsCognitoGroup'?
中的组
我认为这是可能的,尽管我认为最好的方法不是您所想的那样。相反,我可能会建议您设置一个响应映射模板,为您执行一些服务器端过滤。
具体来说,您将首先从当前用户的身份验证令牌中获取组:
#set($claimPermissions = $ctx.identity.claims.get("cognito:groups"))
然后您可以遍历结果中的每个组织。如果任何人的所有者是当前用户,请将他们添加到响应列表中。如果不是,请继续检查 orgAdminsCognitoGroup。您可以通过检查 $claimPermissions 是否包含 orgAdmin 为该组织设置的组来做到这一点。如果包含,则将其添加到响应列表中。如果不是,忽略它并继续迭代。
从理论上讲,可以使用用户登录时使用的令牌来执行此客户端操作。与响应映射模板所做的大致相同,用户所在的组位于令牌内。如果你打开它并拉出组,你可以在那里应用过滤。出于安全原因,我建议不要这样做,尽管这是可能的。
给定以下 AWS Amplify GraphQL 架构 (schema.graphql
):
type Organization
@model
@auth(rules: [
{ allow: groups, groups: ["Full-Access-Admin"], mutations: [create, update, delete], queries: [list, get] },
{ allow: owner },
{ allow: groups, groupsField: "orgAdminsCognitoGroup", mutations: null, queries: [list, get] }
]) {
id: ID!
name: String!
address: String!
industry: [String]!
owner: String
orgAdminsCognitoGroup: String
}
我可以通过以下过滤掉除属于当前认证用户的组织之外的所有组织:
res = await API.graphql(graphqlOperation(listOrganizations, {
// todo: filter by owner OR by is org admin
filter: {
owner: {
eq: this.props.currentUser.username
}
}
}));
但无论如何也可以通过 orgAdminsCognitGroup
进行过滤,这是 Cognito 中属于该组织的动态组吗?我没有发现任何成功尝试使用额外的 @model
来帮助 @auth
规则来保护每个实体。
所以,问题是要过滤用户是其所有者或在 'orgAdminsCognitoGroup'?
中的组我认为这是可能的,尽管我认为最好的方法不是您所想的那样。相反,我可能会建议您设置一个响应映射模板,为您执行一些服务器端过滤。
具体来说,您将首先从当前用户的身份验证令牌中获取组:
#set($claimPermissions = $ctx.identity.claims.get("cognito:groups"))
然后您可以遍历结果中的每个组织。如果任何人的所有者是当前用户,请将他们添加到响应列表中。如果不是,请继续检查 orgAdminsCognitoGroup。您可以通过检查 $claimPermissions 是否包含 orgAdmin 为该组织设置的组来做到这一点。如果包含,则将其添加到响应列表中。如果不是,忽略它并继续迭代。
从理论上讲,可以使用用户登录时使用的令牌来执行此客户端操作。与响应映射模板所做的大致相同,用户所在的组位于令牌内。如果你打开它并拉出组,你可以在那里应用过滤。出于安全原因,我建议不要这样做,尽管这是可能的。