我试图检查,如果两个物体至少有一个普通孩子。在下面的示例中,如果人们可以阅读org.money.value,我希望能够成为控制。
通过比较org.keys和用户的子女来确定阅读权。{auth.uid} .keys。如果有共用密钥,则允许读取。
数据库JSON:
{
"org" : {
"keys" : {
"red" : {
"value" : "..."
},
"blue" : {
"value" : "..."
}
},
"money" : {
"value" : "..."
}
},
"users" : {
"John" : { // in reality John == auth.uid of a user
"keys" : {
"red" : {
"value" : "..."
}
}
},
"Alice" : { // in reality Alice == auth.uid of a user
"keys" : {
"green" : {
"value" : "..."
}
}
}
}
}
规则:
"rules:"{
"org" : {
"money" : {
// can read if "org.keys" and "users.auth.uid.keys"
// have at least one common child name.
// With the above data reading would be allowed for John,
// but not for Alice.
".read" : what to write here?
}
}
}
是否可以使这项工作?
顺便说一下,组织不知道用户的auth.uid。
答案 0 :(得分:0)
我无法想到您可以使用当前的数据库结构在JSON规则中做出此决定。我建议改变你的结构以允许这种类型的读取确定。这是我提出的潜在解决方案,需要在客户端进行更多过滤:
创建新用户密钥时,遍历组织密钥以查看它是否已包含在其中。如果是这样,请将BOOL添加到用户对象,也许是“canReadMoney”并将其设置为true。然后,你的金钱规则看起来像这样:
"rules:"{
"org" : {
"money" : {
".read" : "root.child('users').child(auth.uid).child('canReadMoney').val==true"
}
}
}
答案 1 :(得分:0)
另一种解决方案可能是将端点存储在数据库中,就像这样
usersShareOrg
{
"John": { "Org" : true }
"Alice": {"Org": false}
}
每次添加新用户或org.keys实体时,都会计算并存储这些值。