【问题标题】:Cant read all data with security rules无法使用安全规则读取所有数据
【发布时间】:2021-08-12 21:01:03
【问题描述】:

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

  "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();

【问题讨论】:

  • 你能解释更多问题是什么吗?您有任何错误消息吗?
  • 我没有看到任何错误,只是它没有进入这一行 const data = snapshot.val();当我删除规则时它的工作
  • 设置.read: true是否有效?
  • 这是有效的,但我也需要为非管理员 "Event":{ ".read":true , ".write": true }
  • 如果这样有效:您确定与您测试的用户的值 admin 符合预期吗?

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


【解决方案1】:

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

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

你可以这样写你的规则:

 "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) 

【讨论】:

  • 你能解释一下为什么当我尝试我的方式时,我没有看到任何被 Web 控制台拒绝的规则吗?我也试过你的方法,但得到一个空对象
  • 原因是您需要在$uid 之上的.read 规则来查看列表中的所有元素。这正是你所看到的行为。但是,当您想向单个用户授予访问权限时,.read 需要位于$uid 下。您的管理规则会起作用,但是。如果你把上面的管理规则和单次调用规则放在uid 下,单次调用总是会失败,因为上面的管理规则会返回 false。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 2022-01-18
  • 1970-01-01
  • 2020-06-12
  • 2020-07-07
  • 2021-01-19
相关资源
最近更新 更多