Firebase安全规则不起作用

时间:2017-08-18 15:50:22

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

我遇到Firebase规则问题。基本上我有一个名为'users'的根文件夹,其中包含许多再次包含数据的usersID,完全如下:

users {
    userid1 {
        info_user {
            a: {
                a1: whatever
                a2: whatever       
                a3: {
                    a3.1: whatever
                    a3.2: whatever
                    a3.3: whatever
                    a3.n: whatever
                }
            }
            n: {} ...
        }
    },
    userid2 {}, ...n
}

如果没有安全规则,运行以下代码时一切正常,例如:

{rules {".read"  : true, ".write" : true}}

function getUserInfo () {
    var dbRef = firebase.database();
    var myArray = [];
    dbRef.ref('users').on('child_added', function(snapshot) {
        snapshot.forEach(function(childSnapshot) {
            myArray = (childSnapshot.val().a3);
            // do something
        });
    });
}

我的挑战是在不更改数据库结构的情况下更改安全规则。

所以,我尝试做这样的事情:

{
    "rules" : {
        ".read"  : false,
        ".write" : false,
        "users": {
            "$userid": {
                "info_user": {
                    "a":{
                        ".read": "auth != null",
                        ".write": "(root.child('r').child('w').hasChild(auth.uid))",
                        "a1":{".validate": "newData.isString()"},
                        "a2":{".validate": "newData.isString()"},
                        "a3":{".validate": "newData.isString()"}
                    },
                    "n": {
                        ".read": "auth != null",
                        ".write": "$user_id === auth.uid"
                    }
                }
            }
        }
    }
}

预期结果是在用户通过身份验证时读取节点 a3

怎么做?

1 个答案:

答案 0 :(得分:2)

首次附加侦听器时,会强制执行Firebase数据库读取权限。因此,当您将监听器附加到dbRef.ref('users')时,您必须具有/users的读取权限。在您的安全规则中并非如此。

要使规则有效,请将读取权限移至`users:

{
  "rules" : {
    "users": {
      ".read"  : "auth != null",
      ...

请注意,权限级联下来。因此,一旦您授予用户/users的读取权限,他们就可以访问/users下的所有数据。您不能将此权限取消用于此处的特定节点。

这会导致保护Firebase数据库的一个缺陷:规则不能用于过滤数据。有关详情,请参阅Firebase documentation on "rules are not filters",此answer about it以及更多questions from developers struggling with the concept