首页 > 解决方案 > 无法使用安全规则读取所有数据

问题描述

我正在尝试以具有管理节点的用户身份读取所有事件节点,并且如果不是管理员,则只能读取相关事件。我无法使用此安全规则获取所有事件的问题。

  "Event":{
      "$uid": {
            ".read": "auth.uid == $uid || root.child('Users').child(auth.uid).child('admin').val() == 'admin'",
            ".write": true
        }

我的请求如下所示:

   var starCountRef = firebase.database().ref("Event/"); //trying to read all events as admin
    starCountRef.on("value", (snapshot) => {
      const data = snapshot.val();

标签: reactjsfirebase-realtime-databasefirebase-security

解决方案


我们在这里遇到的问题是 RTDB 规则是自上而下工作的。这意味着,如果顶部的一条规则拒绝访问,则下方的一条规则并不重要。在您的情况下,向管理员授予对整个列表的访问权限是没有问题的,但是对于事件的每个所有者来说也是如此。因为那些可能没有管理员。并且只有.read将uid放在上面才能访问整个列表。

我可以想象有一种方法可以让它发挥作用。有query-based规则。更多关于他们在这里

你可以这样写你的规则:

 "Event":{
      ".read": "query.equalTo == auth.uid || 
           root.child('Users').child(auth.uid).child('admin').val() == 'admin'" 
        }

然后,您需要使用查询访问数据以获取它:

db.ref("Event").orderByKey()
                 .equalTo(auth.currentUser.uid)
                 .on("value", cb) 

推荐阅读