Права пользователей и групп в правилах безопасности Firebase - PullRequest
0 голосов
/ 07 мая 2018

У меня есть приложение, в котором у меня есть объекты данных, и эти объекты могут быть прочитаны / записаны как отдельными пользователями, так и группой пользователей. Я пытаюсь выяснить, каков наилучший подход к написанию правил безопасности для такой логики и лучший способ структурировать мою БД в реальном времени.

Я пытался найти решение, но так и не нашел точного варианта использования. Вот пример моей БД:

{
  "data": {
    "data1": {
      "id": "data1",
      "name": "Some data",
      "content": "Some content...",
      "visibility": "private",
      "owner": "user1"
    },
    "data2": ...
  },

  "dataPermissions": {
    "data1": {
      "user1": "read",
      "user2": "write",
      "group1": "write"
    },
    "data2": {...}
  },

  "groupMembers": {
    "group1": {
      "user3": true,
      "user4": true
    }
  },

  "userGroups": {
    "user4": {
      "group1": true
    }
    ...
  }
}

Мой вопрос заключается в том, как настроить правила безопасности, чтобы проверить, может ли пользователь читать / писать в узел данных? Я знаю, как проверить на одного пользователя. Но я не могу понять, как проверить группу. Как проверить в правилах безопасности, например. user4 может читать / писать в data1 узел? Поскольку у меня может быть несколько групп на пользователя и несколько групп на узлы данных, я не могу адресовать это динамической переменной $uid.

Обратите внимание, что я открыт для изменений в структуре БД. Мне более любопытно, как справиться с этой проблемой в целом без большого количества дублирующих данных (например, сохранение всех пользователей из группы в dataPermissions под узлом идентификатора группы), чтобы поддерживать нормальное обслуживание БД.

Вот как я проверяю права пользователей в правилах безопасности:

"data": {
  "$dataId": {
    ".read": "data.child('owner').val() == auth.uid || data.child('visibility').val() == 'public' || root.child('dataPermissions/' + $dataId + '/' + auth.uid).exists()",
    ".write": "false"
  }
},

Спасибо за помощь.

1 Ответ

0 голосов
/ 16 июня 2018

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

dataUsers
|_ data-1
   |_ user-1: 1
   |_ user-2: 3
   |_ group-1: 1

Число описывает, какие действия пользователь может выполнять с данными (чтение / запись и т. Д.).

ТогдаУ меня есть узел разрешений с похожей структурой, но вместо группы я поставил uid членов группы.Таким образом, я могу ориентироваться на каждого отдельного пользователя для данного объекта данных в правилах безопасности.И так как один пользователь может иметь более одного источника прав доступа для данного объекта (он может быть владельцем данных + может быть членом нескольких групп с разными правами доступа к данным), я отслеживаю все разные источники AR для данного пользователя и накаждое обновление пересчитывает результирующий AR для данного пользователя, чтобы получить наибольшее число из всех его источников AR.

permissions
|_ data-1
   |_ user-1:
      |_ data-1: 1
      |_ group-1: 1
   |_ user-2:
      |_ data-1: 3
      |_ group-2: 2
   |_ user-3:
      |_ group-1: 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...