android - Firebase 规则:如何在节点的所有子节点中搜索值?
问题描述
我正在尝试通过根据 Twitter 登录生成的 uid 在 Firebase 中手动输入应用程序来为应用程序创建管理员。我想知道如何在节点下的所有子节点中搜索特定的 uid 以指定 r/w 访问权限。
我有以下
{
"GRP1" : {
"ORG1" : {
"CONF1" : {
"TEAM1" : {
"ADMINS" : {
"Name1" : {
"uid" : "abcd1239"
},
"Name2" : {
"uid" : "abcf1234"
}
},
"FEED" : {
"Store1" : {
"info1" : "some text"
},
"Store2" : {
"info2" : "some other text"
}
}
}
}
}
}
}
我想根据 uid 是否存在于 ADMINS 中提供对 FEED 的读/写访问。此规则有效:
".read" : "root.child('GRP1').child('ORG1').child('CONF1').child('TEAM1').child('ADMINS').child('Name1').child('uid').val() === auth.uid"
但是如果我有可变数量的管理员,我如何搜索所有的“uid”?我尝试输入子名称作为 uid,然后搜索它是否存在,但读取不起作用:
".read" : "root.child('GRP1').child('ORG1').child('CONF1').child('TEAM1').child('ADMINS').child(auth.uid).exists()"
解决方案
您不能在安全规则中跨节点搜索,因为这不会扩展。这意味着如果要检查 UID 是否存在于 JSON 中的某个位置,则必须将该 UID 作为节点的键。
所以你的 JSON 将是:
{
"GRP1" : {
"ORG1" : {
"CONF1" : {
"TEAM1" : {
"ADMINUIDS" : {
"abcd1239": "Name1",
"abcf1234": "Name2"
}
现在您可以使用以下命令检查 UID 是否存在:
".read" : "root.child('GRP1/ORG1/CONF1/TEAM1/ADMINUIDS').child(auth.uid).exists()"
推荐阅读
- flutter - agora 和 mux 和有什么不一样?在颤动中流式传输实时视频的最佳方式是什么?
- python - 将数据集划分为块并自动计算这些块的均值
- python - SQLAlchemy 具有重复属性的一对多关系
- python - 在 statsmodels 中,形状未对齐到完全相同的形状
- c++ - 如何在 C++ 中创建一个只接受我提供的类型列表的模板?
- graphql - 如何从 Apollo 客户端的多个字段中删除对象?
- css - 高度:在 Safari 中运行时 100% 停止工作
- node.js - 将文件上传到其他用户的 OneDrive 共享时,MS Graph 抛出 401
- c# - 如何单击 C# 中的 Selenium WebDriver 链接所覆盖的复选框
- php - 重定向初始化 ci4 时无法设置登录记住我的 cookie