Firestore Rules多组织多用户访问权限列表数据

时间:2018-09-24 09:37:54

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

我正在尝试为一个新的Firestore项目建立一个规则集,其中有以下根集合:

用户

组织

在用户下,我们有users / userid / ar / organisationid(ar用于访问权限)

此文档应定义用户对给定组织的访问权限。关键是许多用户可以访问此saas应用程序中的一个或多个组织。

我希望再次检查该组织下的所有文档和所有子集合是否具有此访问权限。

这非常适合获取和写入,但是数据列表列出了访问错误,而我发现限制列表数据的唯一方法是在文档上添加一个列出用户ID的数组,并在此客户端上进行过滤侧。这不是一种可用于生产的解决方案,因为会有很多带有许多文档的子集合。

有什么建议吗?还有其他方法可以使Firestore的列表正常工作吗?有没有更好的方法来构造数据或我所缺少的任何东西?

我只能看到的另一种方法是使用firestore函数来执行清单的检查服务器端,但是随后我们将@ angular / fire中的真棒东西放开了。

过滤客户端的安全性不够好。

谢谢。

截至目前的规则:

----------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |      |     2 |    86 |     4   (0)| 00:00:01 |       |       |
|   1 |  UNION-ALL                  |      |       |       |            |          |       |       |
|   2 |   PARTITION HASH SINGLE     |      |     1 |    43 |     2   (0)| 00:00:01 |     1 |     1 |
|   3 |    TABLE ACCESS STORAGE FULL| TAB  |     1 |    43 |     2   (0)| 00:00:01 |     1 |     1 |
|   4 |   PARTITION HASH SINGLE     |      |     1 |    43 |     2   (0)| 00:00:01 |     2 |     2 |
|   5 |    TABLE ACCESS STORAGE FULL| TAB  |     1 |    43 |     2   (0)| 00:00:01 |     2 |     2 |
----------------------------------------------------------------------------------------------------

2 个答案:

答案 0 :(得分:1)

See documentation

  

具有自定义声明和安全规则的控制访问权限

     

Firebase Admin SDK支持在用户上定义自定义属性   帐户。这提供了实现各种访问的能力   Firebase中的控制策略,包括基于角色的访问控制   应用。这些自定义属性可以为用户提供不同级别的   访问(角色),这是应用程序的安全规则中强制执行的。

答案 1 :(得分:0)

您遇到的问题是由于“ 安全规则不是过滤器”这一事实引起的,请参阅此文档item

换句话说,您的查询必须过滤用户具有(读取)访问权限的组织,例如,就像使用“列出usersids的文档上的数组”一样。您还可以在用户文档中将组织列表作为数组。

使用Cloud Function“检查服务器端的列表”并(如果我理解正确的话)基于此Cloud Function调用的结果构建查询确实不是理想的选择。

但是,使用Cloud Function可以做的是在创建/修改/删除userids文档时自动填充/修改列出organizations(或organisationid)的数组在users/userid/ar/organisationid下。


请注意,文档显示:

  

此行为适用于检索一个或多个文档的查询   从集合中而不是从单个文档中检索

这就是为什么您的规则适用于get()方法的原因,