我在编写和测试 Firestore 规则时遇到了一个奇怪的问题。这就是我想要实现的目标:
在客户端(javascript)上,我使用以下行发送文档中的时间戳:
firebase.firestore.FieldValue.serverTimestamp()
Run Code Online (Sandbox Code Playgroud)
这是当前的规则集。可以看到,只有当新的higscore的createdAt晚于session的createdAt时,才能创建分数。
service cloud.firestore {
match /databases/{database}/documents {
function isValidNewScoreEntry() {
return request.resource.data.keys().hasOnly(['createdAt', 'name', 'score']) &&
request.resource.data.createdAt is timestamp &&
request.resource.data.name is string &&
request.resource.data.score is int &&
request.resource.data.name.size() <= 20
}
match /highscores/{entry} {
allow list: if request.query.limit <= 10;
allow get: if true;
allow create: if isValidNewScoreEntry() &&
request.resource.data.createdAt > get(/databases/$(database)/documents/sessions/$(request.auth.uid)).data.createdAt;
}
function isValidNewSession() {
return request.resource.data.keys().hasOnly(['createdAt']) &&
request.resource.data.createdAt is timestamp
}
match /sessions/{entry} {
allow list: if false;
allow get: …Run Code Online (Sandbox Code Playgroud)