бессерверные базы данных, такие как faunadb, поддерживают аутентификацию на основе ролей? - PullRequest
0 голосов
/ 05 февраля 2020

Я новичок в архитектуре без серверов в целом, и я изучаю перенос моего текущего php / mysql rest api в бессерверную архитектуру.

Моя главная задача - контроль доступа.

в определенных приложениях я разрешаю пользователям получать доступ к контенту на основе роли и групп, которым они назначены "

пример

роль: пользователь группы : [1,2,3] может получить доступ только к контенту с group_id: 1 || 2 || 3

Возможно ли такое управление доступом в таких бессерверных базах данных, как faunadb?

1 Ответ

1 голос
/ 05 февраля 2020

Такое управление доступом возможно с FaunaDB и многое другое с системой ABA C (https://docs.fauna.com/fauna/current/security/abac.html)

Роли:

По существу у вас есть роли , и эти роли предоставляют разрешения

CreateRole({
  name: "access_todos",
  privileges: [{
    resource: Collection("todos"),
    actions: {
      create: true,
      update: true,
      delete: true,
      write: true
    }
  }]
})

(вы можете заметить, что это, конечно, дает доступ ко всем группам, что не то, что вам нужно, мы к этому доберемся)

Роли могут быть назначены различным вещам:

  • Ключи : просто создайте ключ с этой ролью, и этот ключ сможет получить доступ только к коллекции групп
  • Функции : пользовательская функция (например, хранимая процедура) может взять на себя роль.
  • Сущности в коллекции или ее части : любой сущности (например, Пользователи, ShareLinks, Учетные записи) можно назначить роль, добавив членство.

Членство в ролях (назначение ролей для объекта базы данных):

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

CreateRole({
  name: "access_todos",
  membership: [{ resource: Collection("accounts") }],
  privileges: [{
    resource: Collection("todos"),
    actions: {
      create: true,
      update: true,
      delete: true,
      write: true
    }
  }]
})

Предположим, идентичность этой сущности (получить ключ для этой сущности базы данных):

Тогда возникает вопрос: «Как мы можем принять личность пользователя?». Мы используем логин для этого. Сначала вы создаете учетную запись с паролем:

Create(
    Class("account"),
    {
      data: { email: "alice@example.com" }
      credentials: { password: "secret password" },
    }));

Важной частью является поле credentials.password, которое является специальным полем для FaunaDB. Он будет зашифрован, и когда у объекта базы данных будет такой пароль, вы можете использовать Login для подтверждения личности объекта:

Login(
    Index("accounts_by_email"), "alice@example.com"),
    { password: "secret password" })

Login предоставит вам токен, и этот токен будет Теперь есть все права, которыми обладает этот аккаунт. Или, другими словами, все привилегии ролей, для которых эта сущность базы данных коллекции «учетные записи» является членом (и членство определяется для роли с помощью ключа членства)

Сила предикатов роли и Функция Identity () '

Хорошо, но как нам получить более детальный доступ? Роли могут иметь лямбда-предикаты вместо логических. Это означает, что в вашем случае вы можете сохранить массив групп для пользователя (или наоборот) и связать учетную запись с пользователем.

privileges: [
  {
    resource: Collection("Groups"),
    actions: {
      read: Query(
        Lambda("groupReference",
          // Write your logic
        )
      )
    }
  }
]

В таком запросе параметр lambda является ссылкой на сущность, к которой вы пытаетесь получить доступ (например, на группу). Остается один вопрос. Как мы можем проверить, имеет ли пользователь, связанный с учетной записью, доступ в группы? Хорошо, мы используем Identity () для того, что является функцией FQL, которая возвращает ссылку на текущую вошедшую в сущность базу данных.

Примечание: по умолчанию вы получаете доступ на чтение / запись к объекту, в который вы вошли. Следовательно, вы не хотите хранить групповые идентификаторы в учетной записи, поскольку пользователь теоретически может их изменить. Вот почему я разделил аккаунт и пользователя в своем объяснении. Мы, вероятно, изменим это в будущей версии FQL, так как это может показаться запутанным / громоздким.

Несколько хороших ресурсов: - ABA C документы: https://docs.fauna.com/fauna/current/security/abac.html - ABA C с GraphQL: https://medium.com/fauna/abac-graphql-6e3273945b1c - Документы по аутентификации: https://app.fauna.com/tutorials/authentication#creating -пользователей

Мы создаем полный пример, который мы ожидаем увидеть на нашем блог в ближайшие недели.

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