【问题标题】:Why cloud firestore rule wont match my path pattern?为什么云 Firestore 规则与我的路径模式不匹配?
【发布时间】:2019-03-20 09:00:30
【问题描述】:

所以我有一个简单的数据库,我想制定一个简单的规则,但由于某种原因它不想匹配我的集合

service cloud.firestore {
  match /databases/{database}/documents {

    match /userPrivate/{user=**} {
      allow read, write: if request.auth.uid == user;
    }

  }
}

【问题讨论】:

    标签: firebase google-cloud-firestore firebase-security


    【解决方案1】:

    您没有指定要正确提取的文档。在询问您文档位置的文本框中,不要添加/databases/(default)/documents。这是自动为您添加的。您应该使用集合和文档 ID 指定文档的路径。例如:/userPrivate/uid 其中“uid”是文档 ID。您可能还应该在模拟器中打开身份验证,以便匹配 id。

    还请记住,当您使用带有两个星的通配符匹配时,例如/userPrivate/{user=**},那么user 变量将包含文档的整个路径,包括所有子集合。这意味着您的规则不适用于子集合中的文档。

    【讨论】:

      【解决方案2】:

      你需要调整你的规则如下:

      service cloud.firestore {
        match /databases/{database}/documents {
      
          match /userPrivate/{user} {
            allow read, write: if request.auth.uid == user;
          }
      
        }
      }
      

      您的通配符必须指向一个单路径文档(这是您通过执行 {user} 获得的)并且不匹配 userPrivate 集合下的任何文档(这是您获得的做{user=**},换句话说“路径的其余部分”)。

      如果您希望允许用户读取/写入具有相同安全级别的 user 文档的子集合中包含的所有文档,则以下规则可以解决问题:

      service cloud.firestore {
        match /databases/{database}/documents {
      
          match /userPrivate/{user} {
            allow read, write: if request.auth.uid == user;
      
            match /{userCollec=**} {
              allow read, write: if request.auth.uid == user;
            }
      
          }
      
        }
      }
      

      我建议您观看有关 Firestore 安全规则的官方 Firebase 视频:https://www.youtube.com/watch?v=eW5MdE3ZcAw&,尤其是从 5 分钟开始的部分。

      【讨论】:

      • 您确定 OP 实际上并不想保护 所有 文档,包括在 userPrivate 集合下组织的所有子集合中的文档?你的提案没有这样做。
      • @DougStevenson 你是对的,我不是 100% 确定 OP 要求,因此我没有涵盖子集合的情况......我已经调整了我的答案来涵盖这种情况。感谢您指出这一点。
      • @ditoslav 嗨,您有机会尝试提出的答案吗?
      猜你喜欢
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-05
      • 2020-04-27
      • 2021-01-29
      • 1970-01-01
      相关资源
      最近更新 更多