Сравните две карты с правилами безопасности Firestore (правило безопасности «многие ко многим»)? - PullRequest
0 голосов
/ 12 февраля 2019

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

// WARNING: INVALID CODE

"accounts": {
  ".read": "auth.token.permissions.fundIDsAdminMap.doAnyKeysMatch(resource.data.fundIDsMemberMap) === true"
}

К сожалению, сравнение двух карт требует специальной встроенной функции (как показано впример выше), или циклы, или рекурсия, ни один из которых, я считаю, не существует в правилах Firebase в данный момент.

Как лучше всего смоделировать это?

Одним из решений является отказ от ролей, таких как "fundAdmin", и вместо этого непосредственно записать accountIDs, который может управлять конкретным объектом на самом объекте.,Таким образом, защита может быть осуществлена ​​от имени пользователя, вошедшего в систему:

resource.data.administeredBy[request.auth.uid] == true

// doc would have administeredBy property
account.administeredBy= {
  accountID1: true,
  accountID5: true
};

Проблема с этим состоит в том, что он увеличивает и усложняет сторону уравнения write.Каждый раз, когда меняется администратор, необходимо написать много отдельных документов, разбросанных по всему миру, чтобы отразить изменение.Кроме того, большее количество избыточных данных должно быть сохранено во многих более разнородных объектах.Кроме того, база данных должна будет играть гораздо более важную роль в управлении разрешениями (из-за необходимости хранить все эти идентификаторы учетной записи), а не в том, что она в основном изолирована от правил безопасности.И, наконец, странно не иметь возможности использовать парадигму «ролей» для организации разрешений.Какие-нибудь умные решения, у которых не так много недостатков?

...