当请求中的 nodeId 与数据库中的 nodeId 匹配时,我可以将 Firebase 实时数据库规则设置为只读吗

Posted

技术标签:

【中文标题】当请求中的 nodeId 与数据库中的 nodeId 匹配时,我可以将 Firebase 实时数据库规则设置为只读吗【英文标题】:Can I set a Firebase Realtime Database rule to read only when nodeId in request matches the nodeId in database 【发布时间】: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 设置在您现在拥有的位置,您的规则可能已经做了您想要的。如果不是这种情况,我建议发布不违反规则的代码。 【参考方案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节点。

【讨论】:

以上是关于当请求中的 nodeId 与数据库中的 nodeId 匹配时,我可以将 Firebase 实时数据库规则设置为只读吗的主要内容,如果未能解决你的问题,请参考以下文章

NodeId 作为 ModelCompiler OPC UA 中的字符串

Opensplice - 从本地参与者获取 C# 中的 nodeId

GraphQL 中的双向获取

sqlserver:如何截取字符串后联合查询出数据

SQL Server 中的 XML 比较(字符串)

Vue2.0中的Ajax请求