Есть ли способ настроить авторизацию на уровне поля в FaunaDB + GraphQL? - PullRequest
2 голосов
/ 24 февраля 2020

У меня проблемы с поиском способа скрыть электронные письма пользователей от всех, кроме владельца (у пользователя есть доступ только к его электронным письмам). Есть ли способ скрыть определенное поле документа для определенных ролей?

Вот пример, который я нашел, который создает роль с динамическим c доступом ко всей коллекции User:

CreateRole({
  name: "tier1_role",
  membership: {
    resource: Collection("User"),
    predicate: Query(
      Lambda("userRef",
        // User attribute based rule:
        // It grants access only if the User has TIER1 role.
        // If so, further rules specified in the privileges
        // section are applied next.
        Equals(Select(["data", "role"], Get(Var("userRef"))), "TIER1")
      )
    )
  },
  privileges: [
    {
      // Note: 'allUsers' Index is used to retrieve the
      // documents from the File collection. Therefore,
      // read access to the Index is required here as well.
      resource: Index("allUsers"),
      actions: { read: true }
    }
  ]
})

Я попытался немного его изменить, но мне не удалось настроить доступ на уровне поля.

Допустим, я настроил FaunaDB со схемой GraphQL ниже.

enum UserRole {
  TIER1
}

type User {
  email: String! @unique
  username: String! @unique
  role: UserRole!
}

type Query {
  allUsers: [User!]
}

type Mutation {
  addUsers(new_users: [UserInput]): [User]
    @resolver(name: "add_users", paginated: false)
}

Как создать роль FaunaDB таким образом, чтобы у всех пользователей ( кроме текущего ) в результирующем массиве из запроса allUsers не было поля email?

Я мог бы разбить коллекцию User на две части: одна - publi c, другая доступна владельцу документа, но это звучит неправильно.

Я новичок в нет SQL концепция, так что, может быть, я смотрю на эту проблему с неправильной точки зрения?

1 Ответ

1 голос
/ 22 апреля 2020

это запрос, который появлялся несколько раз. Возможно, вы захотите сделать это прямо в ролевой системе FaunaDB ABA C, но, хотя она обеспечивает безопасность на уровне строк, скрытие указанного поля c в настоящее время еще не предусмотрено. Обратная связь была зарегистрирована, но мы рассмотрим ее.

Текущий способ сделать это - выделить пользователей из учетных записей и выбрать пользователей вместо учетных записей. Было бы полезно иметь что-то вроде скрытых полей, хотя в будущем.

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

Вы также можете создать тонкую оболочку, используя Apollo в функции без сервера, и отфильтровать эти поля при прохождении результатов. Существует руководство, которое объясняет, как создать такое тонкое промежуточное ПО Apollo, которое просто делегирует FaunaDB https://www.gatlin.io/blog/post/social-login-with-faunadb-and-auth0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...