AWS Усилить фильтр GraphQL с помощью динамической группы пользователей Cognito - PullRequest
0 голосов
/ 08 января 2019

С учетом следующей схемы 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 правилами для защиты каждой сущности.

1 Ответ

0 голосов
/ 09 января 2019

Итак, вопрос состоит в том, чтобы отфильтровать группы, владельцем которых является пользователь, или в orgAdminsCognitoGroup??

Я думаю, что это возможно, хотя я не думаю, что лучший способ - это то, что вы имели в виду. Вместо этого я могу порекомендовать вам настроить шаблон отображения ответов, который выполняет фильтрацию на стороне сервера.

В частности, вы сначала получите группы из токена авторизации текущего пользователя:

#set($claimPermissions = $ctx.identity.claims.get("cognito:groups"))

Тогда вы можете перебирать результаты по каждой организации. Если у кого-либо есть владелец, который является текущим пользователем, добавьте его в список ответов. Если это не так, продолжайте проверять orgAdminsCognitoGroup. Это можно сделать, проверив, содержит ли $ ClauppPermissions группу, для которой установлен orgAdmin для этой организации. Если он содержится, добавьте его в список ответов. Если нет, игнорируйте его и продолжайте повторять.

Теоретически было бы возможно сделать на стороне клиента токен, с которым пользователь вошел в систему. Почти так же, как шаблон сопоставления ответов сделал это, группы, в которых находится пользователь, находятся внутри токена. Если вы раскроете его и вытащите группы, вы можете применить там фильтрацию. Я бы порекомендовал не делать этого по соображениям безопасности, хотя это возможно.

...