Firebase 安全规则。如何允许存储在文档内数组中的管理员访问?

cue*_*ess 0 firebase firebase-security google-cloud-firestore

我有一个 firebase firestore 文档,其中将管理员 ID 存储在管理员数组中。如果请求用户 ID 位于该管理员列表中,如何创建允许读取和写入的安全规则。

我想知道3个案例:

  1. 如果我有这条规则,我如何还允许管理员写入和读取:

    match /users/{uid}{
      allow read,write: if request.auth != null;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我可以在 securityrules 中创建一个函数,例如isAdmin() ,我可以在每个规则中使用它来接受管理员吗?

  3. 是否可以制定一个(或两个)规则来允许管理员读取和写入数据库中的所有内容,而不是为每个集合编写规则?

小智 5

我相信这三个问题的答案都是肯定的:

  1. 您可以使用||运营商
  2. 是的,函数是允许的!
  3. 是的,规则是自上而下继承的

我非常推荐这两个视频:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    function isAdmin() {
        let admins = get(/databases/$(database)/documents/roles/admins);
      return request.auth.uid in admins.data.users;
    }
    match /{document=**} {
        allow read, write: if isAdmin();
    }
    match /users/{userId} {
      allow read, write: if isAdmin() || request.auth != null && request.auth.uid == userId;
      allow create: if request.auth != null;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这在我的测试数据库中为我带来了成功 在此输入图像描述 在此输入图像描述

如果您还没有使用过规则游乐场,那么这是一个很好的起点: 在此输入图像描述

  • 赞成(并放弃了我自己的答案)。更不用说“let”这个词的美妙用法了,我已经赞成了。:) 顺便说一句:我通常有一个用于 `request.auth != null && request.auth.uid == userId` 的 `isOwner` 函数,这样主要规则就变成了 `isOwner() || isAdmin()` (2认同)