当请求中的 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 中的字符串