Firebase实时数据库 - 规则 - 两个对象是否至少有一个普通子项?

时间:2016-08-23 15:02:38

标签: firebase firebase-realtime-database firebase-security

我试图检查,如果两个物体至少有一个普通孩子。在下面的示例中,如果人们可以阅读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。

2 个答案:

答案 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实体时,都会计算并存储这些值。