google-cloud-firestore - 多权限 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),仅适用于对象/地图(通过将用户声明字符串拆分为数组来尝试,没有运气)。
有任何想法吗?
解决方案
操作员仅在in
列表上工作。这个声明的值{"companyLocation": "testLocation2 ¤ testLocation3"}
不是一个列表,而是一个字符串。所以in
操作员不会在这里工作。
有关支持的运算符列表,请参阅安全规则中字符串类型的文档。这没有提到contains
方法,但确实有一个matches
方法,可以让您完成这个用例。
request.auth.token.companyLocation.matches('.*testLocation2.*')
您还可以尝试将声明存储为数组:
{"companyLocation": ["testLocation2", "testLocation3"]}
如果设置这样的声明有效,则in
操作员应该工作。我说应该在这里,因为最近有人在设置这样的声明时遇到了麻烦,而我自己还没有测试过。
推荐阅读
- kubernetes - GKE's cluster autoscaler got stucked in initializing status
- modal-dialog - Office Fluent UI / Fabric UI Modal - how can I control where it appears?
- reactjs - Material UI自动完成上的Typescript Equality问题
- azure - 为 Form Recognizer 2.0 添加 Azure Logic App 步骤存在内置连接问题
- microsoft-graph-api - Graph API 不允许在线会议
- sql - 使用 TO_NUMBER 解析固定计数法和科学计数法的数字
- react-native - react native jest mock api调用自定义模块
- javascript - 为什么开发者控制台对相同的数据输入给出不同的结果?
- python - 输出 .csv 文件仅写入最后一个查询。如何让它打印所有 url 检查?
- python - 在 python 类中创建多个 pybullet 客户端实例