Firestore - 访问安全规则中的事务/嵌套数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Firestore - 访问安全规则中的事务/嵌套数据相关的知识,希望对你有一定的参考价值。

我希望有人可以帮我这个。我真的很喜欢新的Firestore测试版,但目前缺乏模拟器/调试器让我遇到了问题。

我有一系列场景可以进行投票或投票。我想限制任何恶意向上投票/向下投票的人多次,所以我也有场景的子集合。这些只是userId键入的包含类似哈希的文档

{
  up: true,
  down, false
}

enter image description here

为了在一个请求中编写这些多个项目(即场景文档和投票子集合),我使用了一个事务。

我遇到的问题是,我想验证当用户更新“点数”时,它必须附有一个投票文件,该投票文件设置/下降为真,具体取决于点数以及投票是否已经存在用户。

在安全规则中,当我在场景文档级别进行验证时(或反之亦然),如何在请求中退出投票子集合数据时如何读取?我的理解是“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点验证是因为如果用户已经对一个场景进行了投票,他们可以通过执行向上投票(删除现有的向下投票+新的向上投票)来增加两个点。一旦我知道如何访问“投票”细节,这个验证将变得更加复杂:)

答案

如果您仍然遇到此问题,可以尝试在安全规则中使用exists()函数:

allow update: if !exists(/databases/$(database)/documents/scenarios/$(scenarios)/votes/$(request.auth.uid));

或者,如果数量不会达到firestore文档配额,您可能需要考虑将uid列表存储在数组中以检入文档中的规则:

//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);

使用这种方法,您需要有一个后台工作程序将userid添加到数组中,并阻止用户使用以下方法写入投票数组:

allow update: if request.resource.data.voted == resource.data.voted;

以上是关于Firestore - 访问安全规则中的事务/嵌套数据的主要内容,如果未能解决你的问题,请参考以下文章

使用访问规则中的字段写入 Firestore 时缺少权限或权限不足

如何检查传入号码数据是否大于或小于Firestore安全规则中的特定限制?

如何根据设备平台为 Firestore 指定安全规则?

我应该如何构建我的 Firestore 安全规则?

Firestore 安全规则 - 允许基于其父文档数据读取子集合

Firebase Firestore 安全规则共享数据