我希望有人可以帮我解决这个问题。我真的很喜欢新的Firestore测试版,但目前缺乏模拟器/调试器让我遇到了问题。
我有一系列可以进行投票或投票的方案。我想限制任何恶意向上投票/向下投票的人多次,所以我也有场景的子集合。这些只是userId键入的文档,其中包含类似
的哈希值{
up: true,
down, false
}
为了在一个请求中编写这些多个项目(即场景文档和投票子集合),我使用了一个事务。
我遇到的问题是我想验证当"点"由用户更新必须附带投票文档,该投票文档设置/下降为true,具体取决于点数以及用户是否已存在投票。
在安全规则中,当我在场景文档级别进行验证时(或反之亦然),如何查看投票子集合数据是否在请求中退出?我理解" request.resource.data"只允许您查看正在写入的当前文档级别的数据(我可能在这里错了,但没有简单的方法可以检查,文档中没有任何内容)。到目前为止,这是我的安全规则的一个示例:
service cloud.firestore {
match /databases/{database}/documents {
// Scenarios
match /scenarios/{scenarioId} {
allow read;
// Only allow write if all of these are true
allow write: if request.auth.uid == request.resource.data.userId &&
// points
request.resource.data.points == 0;
allow update: if request.auth.uid != null &&
(
request.resource.data.points >= (resource.data.points - 2) ||
request.resource.data.points <= (resource.data.points + 2)
)
// TODO: Only allow write to points IF accompanied by a "votes" document for that userId
// Votes
match /votes/{voterId} {
allow write: if voterId == request.auth.uid;
}
}
}
}
请注意,当前的+/- 2点验证是因为如果用户已经对一个场景进行了投票,他们可以通过执行向上投票(删除现有的向下投票+新的向上投票)来增加两个点投票)。一旦我知道如何访问&#34;投票&#34;此验证将变得更加复杂。详情:))
答案 0 :(得分:0)
如果您仍然遇到此问题,可以尝试使用安全规则中的exists()函数:
df.index = df.index.droplevel()
df
Fecha 20/12/17 21/12/17
Esteban
Revenue $1 $7,890
Impresiones2 1235 99
Impresiones 667 235
Jose
Revenue $12 $2
Impresiones2 35 5
Impresiones 1312 25
Martin
Revenue $146 $123
Impresiones2 56 523
Impresiones 12 6347
Pedro
Revenue $1,256 $22
Impresiones2 124 898
Impresiones 5443 2368
或者,如果数量不会达到firestore文档配额,您可能需要考虑在数组中存储uid列表以检查文档中的规则:
allow update: if !exists(/databases/$(database)/documents/scenarios/$(scenarios)/votes/$(request.auth.uid));
使用这种方法,您需要有一个后台工作程序将userid添加到数组中,并阻止用户使用以下方法写入投票数组:
//your document structure
points: 0
someData: xx
voted: [id1, id2, id3 .. n]
//in the rules
allow update: if !(request.auth.uid in resource.data.voted);