首页 > 解决方案 > 多权限 Firestore 安全规则

问题描述

我的网站有多个具有不同权限的帐户。

我在 Firestore 令牌中使用自定义声明来授予用户正确的访问权限。

到目前为止,它与此设置完美配合:

有权访问 1 个位置的用户 1 的声明如下所示:{"companyLocation": "testLocation1"}

很快,我将拥有可以访问一个或多个位置的用户。例如,用户 2 可以访问“testLocation2”和“testLocation3”,而无需访问“testLocation1”。

例如,用户 2 声明可以有一个分隔符(“ ¤ ”),看起来像这样:{"companyLocation": "testLocation2 ¤ testLocation3"}

我将如何通过安全规则实现这一目标?我试过了:

function checkMultipleLocations(){
  return request.auth.token.companyLocation.contains('testLocation2');
}

这给了我一个错误说明:

无效的函数名称:包含

在文档中它声明您可以使用in: v in x(检查值 v 是否在列表 x 中),但这不适用于列表(不返回 true),仅适用于对象/地图(通过将用户声明字符串拆分为数组来尝试,没有运气)。

有任何想法吗?

标签: google-cloud-firestorefirebase-security

解决方案


操作员仅在in列表上工作。这个声明的值{"companyLocation": "testLocation2 ¤ testLocation3"}不是一个列表,而是一个字符串。所以in操作员不会在这里工作。


有关支持的运算符列表,请参阅安全规则中字符串类型的文档。这没有提到contains方法,但确实有一个matches方法,可以让您完成这个用例。

request.auth.token.companyLocation.matches('.*testLocation2.*')

您还可以尝试将声明存储为数组:

{"companyLocation": ["testLocation2", "testLocation3"]}

如果设置这样的声明有效,则in操作员应该工作。我说应该在这里,因为最近有人在设置这样的声明时遇到了麻烦,而我自己还没有测试过。


推荐阅读