Firebase 安全规则如何通配除指定路径之外的所有路径

问题描述 投票:0回答:4

让我们想象一组具有以下字段的规则:

service cloud.firestore {
   match /databases/{database}/documents {
     match /stories/{story} {}
     match /comments/{comment} {}
     match /posts/{post} {}
  }
} 

我们想使用 come sort 通配符为所有剩余的集合添加一个新的匹配条件。

我怎样才能实现这个目标?

firebase google-cloud-firestore firebase-security
4个回答
2
投票

我相信这是不可能的。如果您在像这样的集合的匹配中使用通配符:

match /{collection}/{doc} { ... }

然后它将匹配所有集合中的所有文档,包括故事、评论和帖子。这当然不是你想要的。无法使用通配符进行子字符串或正则表达式匹配。它始终适用于路径中的整个集合或文档 ID。


1
投票

我最近遇到了这个问题,并找到了解决方案。通配符(非递归)不仅可以在文档级别,还可以在集合名称级别。

您的示例的解决方案可能是:

service cloud.firestore {
   match /databases/{database}/documents {
     match /{collection}/{docName}/{document=**} {
         allow read: if collection == 'comments';
         allow write: if collection != 'posts';
    }
  }
} 

仅举个例子,我希望我已经说清楚了


0
投票

您可以使用最近在 Firestore 规则版本 2 中引入的递归通配符来执行此操作。但你需要像这样指定规则版本:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in collection and subcollections
    match /{path=**} {
      allow read, write: if <condition>;
    }
  }
}

您可以在此处找到更多详细信息:https://firebase.google.com/docs/firestore/security/rules-struct#recursive_wildcards


0
投票

我的项目需要这个,我已经通过利用

request.path
并为我需要从通配符中排除的路径添加例外来解决它:

service cloud.firestore {
    match /databases/{database}/documents {
        match /{document=**} {
          allow read, write: if <condition> && !isExcludedPath();
        }
        match /stories/{story} {}
        match /comments/{comment} {}
        match /posts/{post} {}
    }
} 


    function excludedCollections(){
        return ["stories", "comments", "posts"]
    }

    function pathContainsAny(pathArray){
        return string(request.path).split("/").hasAny(pathArray)
    }
    function isExcludedPath(){
        return pathContainsAny(excludedCollections())
    }

string(request.path)
- 这种强制对于这种方法至关重要,是最近才引入的,所以如果您在这里遇到错误,请将您的
firebase-tools
升级到最新版本

© www.soinside.com 2019 - 2024. All rights reserved.