聊天/留言板应用程序-Firebase Firestore规则与功能

时间:2019-04-06 09:35:13

标签: firebase google-cloud-firestore firebase-security-rules

我正在开发一个自定义的聊天应用程序-看起来之前已经完成了,所以我不会进入设计或询问如何设计它。

我将为您提供我的设计理念,并在考虑时考虑是否使用Firestore规则或Firebase函数,因为我担心我可能会为适当保护所有规则而苦苦挣扎。

从本质上讲,这个问题归结为我应该直接与Firestore数据库对话还是使用“功能”来帮助控制数据访问。

应用程序将具有分层的组结构。因此,一组可能包含一个或多个组。用户可以创建自己的顶级组,以创建自己的独立组结构。

用户可以是一个或多个组的成员,并且可以具有一个或多个特权或权限,即管理,审核或发布。

每个组都可以设为公开或私有,以方便查看该组以及查看其中的内容。私人组将要求管理员邀请新用户,而公共组将需要用户申请加入。加入过程将自动批准成员资格,或者需要管理员或主持人批准成员资格。

每个组和每个用户可能需要审核消息。

除非被覆盖,否则组权限将被继承。

根据组的不同,用户可能具有不同的权限。例如,即使DEF可能是ABC的孩子,他们也可能具有发布到ABC组的权限,但没有发布到DEF组的权限。

我快速浏览了一下:

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

似乎我可能需要使用“访问其他文档”部分。但是,即使只是访问或链接一组文档看起来也很复杂,但我不知道当我需要降低两到三个级别时它如何工作。

试着想一想,例如,如果我有一个UserPermissionsForGroup集合,其中包含显式用户权限和已分配访问权限的组,那么我应该能够为Group集合编写一个规则来检查该组文档ID,用户ID和锁定数据库的权限。

对于分层结构,我不确定规则是否可以让我逐步了解每个父母。尽管考虑了这一点,我可能可以做的只是将顶级组的父ID存储在子组中,然后进行检查。

我为此的数据库结构是:

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

UserPermissionsForGroup

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

角色(例如,管理员,主持人,用户,仅查看)

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 Functions,然后与Angular Web应用程序和Flutter移动应用程序中的功能进行对话?

0 个答案:

没有答案