让我们想象一组具有以下字段的规则:
service cloud.firestore {
match /databases/{database}/documents {
match /stories/{story} {}
match /comments/{comment} {}
match /posts/{post} {}
}
}
我们想使用 come sort 通配符为所有剩余的集合添加一个新的匹配条件。
我怎样才能实现这个目标?
我相信这是不可能的。如果您在像这样的集合的匹配中使用通配符:
match /{collection}/{doc} { ... }
然后它将匹配所有集合中的所有文档,包括故事、评论和帖子。这当然不是你想要的。无法使用通配符进行子字符串或正则表达式匹配。它始终适用于路径中的整个集合或文档 ID。
我最近遇到了这个问题,并找到了解决方案。通配符(非递归)不仅可以在文档级别,还可以在集合名称级别。
您的示例的解决方案可能是:
service cloud.firestore {
match /databases/{database}/documents {
match /{collection}/{docName}/{document=**} {
allow read: if collection == 'comments';
allow write: if collection != 'posts';
}
}
}
仅举个例子,我希望我已经说清楚了
您可以使用最近在 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
我的项目需要这个,我已经通过利用
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
升级到最新版本