【问题标题】:Can I set a Firebase Realtime Database rule to read only when nodeId in request matches the nodeId in database当请求中的 nodeId 与数据库中的 nodeId 匹配时,我可以将 Firebase 实时数据库规则设置为只读吗
【发布时间】:2021-07-23 06:55:56
【问题描述】:

我的数据库结构

 {
        "messages": {
            "-top_level_random_push_id": { 
                "-child_level_random_push_id": { --- I don't have this id on device, I have all other id's defined here
                    "createdBy": "hgdhjstdvhhghjg6765HHH87AA", --- firebase uid
                    "message": "Hello",
                    "sentTo": "jhgsjdg6565KKKgsdsgdfGGGJ", ---- firebase uid
                    "timestamp": 1602047893089
                }
            }
        }
    }

// 这就是我从我的 android 应用程序中读取的方式

firebaseRef = FirebaseDatabase.getInstance().getReference("messages").child("-top_level_random_push_id")
firebaseRef.addListenerForSingleValueEvent(object : ValueEventListener {
}

如果请求包含-top_level_random_push_id,我可以设置数据库规则以允许只读吗?基本上只有当conversions/-top_level_random_push_id ===来自客户端请求的子节点id时才允许读取操作

"conversations": {
            "$convoId": {
                ".indexOn": "timestamp",
                ".read": "$convoId == nodeId from the request" --- Not sure how to get this node id from request
            }
        },
    }

【问题讨论】:

  • 我不确定我是否理解这个问题。您的安全规则仅允许用户阅读对话,前提是他们为该对话指定了 convoId。这与您共享的 Android 代码非常匹配,因此我不确定您在 .read 规则中需要哪些内容。
  • 感谢 Frank 的检查。我想我想太多用例了。
  • 哦,我不是这个意思。我只是认为,如果您将".read": true 设置在您现在拥有的位置,您的规则可能已经做了您想要的。如果不是这种情况,我建议发布不违反规则的代码。

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


【解决方案1】:

如果你有以下规则:

{
  "rules": {
    "conversations": {
      "$convoId": {
        ".read": true
      }
    }
  }
}

然后用户只能阅读他们知道 ID 的特定对话。


所以你的代码读取数据:

FirebaseDatabase.getInstance().getReference("messages").child("-top_level_random_push_id")

将被允许,因为他们指定了一个 ID。如果-top_level_random_push_id 存在于数据库中,他们将取回该数据。如果它不存在,他们将获得一个空快照。


如果您只想让用户在指定 ID 并且存在的情况下读取节点,您可以这样做:

".read": "data.exists()"

这种情况的不同之处在于,如果节点不存在,读取将被拒绝,而不是他们得到一个空的快照。


如果有人尝试使用以下代码读取所有数据:

FirebaseDatabase.getInstance().getReference("messages")

那么这个读取将被上面的两个规则拒绝,因为没有人被授予读取权限来读取你的规则中的整个messages节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 2017-11-30
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 2022-11-30
    相关资源
    最近更新 更多