Firebase数据库规则

时间:2017-02-24 13:59:45

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

我遇到了一些围绕数据库规则的问题,文档没有帮助。我正在尝试设置,以便只有用户可以删除自己的项目,但此刻我得到permission_denied错误。我假设这是因为我没有'items'级别的读/写规则。但是我觉得如果我只是添加了一个'auth!= null'规则,它会给予很多许可。有什么想法吗?

数据库设置:

users:
{
    user_1 {
        items:
        {
            item_1: true,
            item_2: true,
        }
    }, 
    user_2 {...},
    etc {...},
}, 
items:
{
    item_1
    {
        user: "user_1"
        ....
    }, 
    item_2
    {
        user: "user_1"
        ....
    }, 
}

数据库规则类似于

{
    "rules": {
        "users": {
            "$uid":{
               ".read": "auth != null && auth.uid==$uid",
               ".write": "auth != null && auth.uid==$uid"
            }
        },
        "items": {
            "$itemID": {
               ".read": "root.child('Users/'+auth.uid+'/'+$itemID).exists()", 
               ".write": "root.child('Users/'+auth.uid+'/'+$itemID).exists()"
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

目前任何用户都可以删除任何项目。

要确保只有所有者可以删除该项目,您不仅需要验证:

   "items": {
        "$itemID": {
           ".read": "auth.uid == data.child('user').val()", 
           ".write": "auth.uid == data.child('user').val()"
        }
    }

据我所知,没有必要检查它们是否存在于/users节点中,尽管如果需要,您可以轻松地将其添加回来。

但是如果用户只能读/写他们自己的项目,我会以不同的方式对数据进行建模:

"items": {
    "$uid": {
        ".read": "auth.uid == $uid", 
        ".write": "auth.uid == $uid"
        "$itemID": {
        }
    }
}

这对模型来说简单得多,并且会为您提供更好的可伸缩性,因为数据库只需考虑一个用户的数据。