鉴于实时数据库中“聊天”节点的规则:
"chats": {
"$chatUID": {
"$messageUID": {
".validate": "newData.hasChildren(['message', 'date', 'from', 'to'])",
".write": "auth.uid != null", // unauthorized users should not be able to even try to send data here
".read": "data.child('from').val() === auth.uid || data.child('to').val() === auth.uid",
"from": {
".validate": "newData.val() === auth.uid"
},
"to": {
".validate": "root.child('friends/' + newData.val() + '/' + auth.uid).exists()"
},
"message": {
".validate": "newData.isString() && newData.val().length > 0 && newData.val().length < 256"
},
"date": {
".validate": "newData.val() == now" // ServerValue.TIMESTAMP
},
"$other": {
".validate": false
}
}
}
} // chats
客户可以检索 $chatUID 上的数据,按日期对孩子进行排序吗?目前 $chatUID 没有读取规则,恐怕即使我会完成对 $messageUID 的读取要求,除非我知道特定的 $messageUID,否则我将无法从 $chatUID 获取任何数据。这是正确的还是我仍然可以在 $chatUID 上使用客户端查询给定规则?
我想您是在问您的规则是否允许此查询:
var ref = firebase.database().ref("chats").child(firebase.auth().currentUser.uid);
ref.orderByChild("date").once("value", ...
在这种情况下,Firebase 数据库服务器所做的是检查用户是否有权读取/chats/$uid
. 由于那里没有人具有读取权限,因此拒绝侦听器。
许多不熟悉 Firebase 的开发人员希望安全规则能够主动过滤数据,但这并不是他们的工作方式。他们所做的只是检查是否允许整个操作,一旦您附加了侦听器,他们就会这样做。换句话说:安全规则不能用于过滤数据。
然而,从大约一年前开始,您可以使用安全规则来验证某些类型的过滤器。例如,您可以只允许读取过滤数据的from
.
因此,例如这些规则/chats/$uid
:
".read": "auth.uid != null &&
query.orderByChild == 'from' &&
query.equalTo == auth.uid"
将允许此查询:
ref.orderByChild("from").equalTo(firebase.auth().currentUser.uid).once("value", ...
虽然它会拒绝
ref.once("value", ...
这意味着您可以允许某些查询,同时拒绝其他读取。但是,我认为根据您的from
和to
属性的需要,不可能需要多个子句。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句