Приложение для работы с чатом / доской объявлений - Firefase Firestore Rules vs Functions - PullRequest
0 голосов
/ 06 апреля 2019

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

Я поделюсь с вами своей философией дизайна и задам вопрос, стоит ли вам придерживаться правил Firestore или функций Firebase, так как, боюсь, я могу бороться с правилами, чтобы должным образом защитить все.

По сути, вопрос сводится к тому, должен ли я напрямую общаться с базой данных Firestore или использовать функции для контроля доступа к данным.

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

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

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

Каждой группе и каждому пользователю может потребоваться модерирование сообщений.

Разрешения группы будут унаследованы, если не будут переопределены.

Пользователи могут иметь разные разрешения в зависимости от группы. Например, у них может быть разрешение на публикацию в Group ABC, но не разрешение на публикацию в Group DEF, даже если DEF может быть дочерним элементом ABC.

Я быстро взглянул на это:

[https://firebase.google.com/docs/firestore/security/rules-conditions]

Похоже, мне может понадобиться использовать раздел «Доступ к другим документам». Однако даже простой доступ или ссылка на один набор документов выглядит достаточно сложным, я не знаю, как это будет работать, когда мне нужно пройти два или три уровня вниз.

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

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

Моя структура базы данных для этого:

* Группа 1032 *

id: string;
parentId: string;
inheritFromTopParentId: string;
inherit: boolean;
name: string;
description: string;
active: boolean;

UserPermissionsForGroup

id: string;
userId: string;
inheritFromTopParentId: string;
roleId: string;

Роли (например, Администратор, Модератор, Пользователь, ViewOnly)

id: string;
name: string;
description: string;

RolePermission (укажите, какие разрешения имеет роль)

id: string;
roleId: string;
permissionId: string;

Разрешение (например, Пригласить пользователя, Утвердить пользователя, Утвердить сообщение, Создать группу, Создать сообщение)

id: string;
name: string;
description: string;

Тогда мне нужно правило, похожее на это ...

service cloud.firestore {
  match /databases/{database}/documents {
    match /Groups/{inheritFromTopParentId} {
      allow read, write: if get(/databases/$(database)/documents/UserPermissionsForGroup/$(inheritFromTopParentId)).data.allowCreateGroup == true 
    }
  }
}

Из этого раздела моего дизайна базы данных видно, что для проверки прав доступа к группам мне нужно будет проверить пользователя и группу, чтобы получить применяемую роль, затем из роли взглянуть на разрешение роли и затем разрешение определить, можем ли мы применить соответствующие разрешения «Создать» или «Просмотреть», чтобы иметь возможность создавать или просматривать группы. Затем мне нужно будет сделать нечто подобное для сообщений, а также указать, одобрен ли пользователь или сообщение и какова видимость группы.

Это достижимо с помощью правил Firestore? Или я должен сократить свои потери и использовать функции Firebase, а затем поговорить с ними в моем веб-приложении Angular и мобильном приложении Flutter?

...