我正在开发一个自定义的聊天应用程序-看起来之前已经完成了,所以我不会进入设计或询问如何设计它。
我将为您提供我的设计理念,并在考虑时考虑是否使用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移动应用程序中的功能进行对话?