我目前正在直接从客户端使用Firebase Cloud Firestore开发Flutter应用。
实际上,我的Firebase数据库的读取规则存在问题。 实际上,我想添加一个属性,该属性将仅读取不到5分钟的数据。
所以
这些是我当前的读写规则:
service cloud.firestore {
match /databases/{database}/documents {
match /locations/{allDocuments=**} {
allow read: if request.time.toMillis() >=
resource.data.timestamp;
allow write: if true;
}
}
}
这是我在Flutter代码中读取数据的函数:
void _updateMarkers(List<DocumentSnapshot> documentList) {
print(documentList);
markers.clear();
documentList.forEach(
(DocumentSnapshot document) {
final String markerIdVal = 'marker_id_$_markerIdCounter';
_markerIdCounter++;
final MarkerId markerId = MarkerId(markerIdVal);
setState(() {
GeoPoint pos = document.data['position']['geopoint'];
var marker = Marker(
markerId: markerId,
position: LatLng(pos.latitude, pos.longitude),
icon: BitmapDescriptor.fromAsset('assets/ticket_point.png'),
infoWindow:
InfoWindow(title: 'Ici à :', snippet: document.data['time']));
markers[markerId] = marker;
});
},
);
我真的不知道该怎么做,我在其他主题上进行了很多搜索,但没有得到真正的答案。
提前谢谢!
答案 0 :(得分:0)
您在安全规则方面非常接近。您正在寻找的是全局duration namespace,不需要toMillis()
。
service cloud.firestore {
match /databases/{database}/documents {
match /locations/{allDocuments=**} {
allow read: if request.time - duration.value(5, 's') >= resource.data.timestamp;
allow write: if true;
}
}
}
这是说“如果请求是从现在到5秒钟之间带有时间戳的文档,则允许对其进行读取。
不过,安全规则并未充当过滤器,因此您将需要一个仅请求最近数据的查询,并且由于客户端的设备可能未与Google同步,因此,您还需要考虑以下内容云功能以检索当前时间。 [您也可以考虑使用Google的Public NTP服务,但它没有SLA]。