我具有以下firestore结构,基本上是3个集合
公共数据 protecteddata1 protecteddata2
我想拥有protecteddata1和protecteddata 2,实际上整个firestore数据库仅作为经过身份验证的用户使用。 但是我希望公众可以只读访问“ publicdata”集合。
以下是我的尝试,但不起作用
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read;
allow write: if (request.auth.uid != null);
}
match /publicdata {
allow read;
}
}
}
答案 0 :(得分:3)
此处的递归通配符允许访问所有集合:
match /{document=**} {
allow read;
allow write: if (request.auth.uid != null);
}
一旦任何规则允许访问集合,该访问都无法被其他任何规则撤销。
您要做的是按照自己的规则调用每个单独的集合。是的,这很痛苦,但这是您唯一的选择。这也使规则的读者可以很清楚地知道每个集合打算允许什么。
还值得注意的是,该规则实际上根本不做任何事情,因为它与任何文档都不匹配:
match /publicdata {
allow read;
}
如果要匹配publicdata集合中的文档,则需要一个与该集合中的文档匹配的通配符:
match /publicdata/{id} {
allow read;
}
请记住,规则要与文档匹配才能访问,而不是集合。
答案 1 :(得分:1)
您可以使用我创建的以下功能来实现
function isUserAuthenticated() {
return request.auth.uid != null;
}
然后您可以像这样使用它:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if isUserAuthenticated();
}
match /publicdata/{itemId} {
allow read : if true;
allow create : if isUserAuthenticated();
allow update: if isUserAuthenticated();
allow delete: if isUserAuthenticated();
}
/* Functions */
function isUserAuthenticated() {
return request.auth.uid != null;
}
}
}
接受,如果它对您有用。可在评论中提出更多问题。
答案 2 :(得分:0)
因为 here 是说:
<块引用>一个文档可能匹配多个匹配语句。在多个允许的情况下 表达式匹配请求,如果有任何一个,则允许访问 条件为真:...
你可以使用这个:
rules_version = '2';
service cloud.firestore {
// Check if the request is authenticated
function isAuthenticated() {
return request.auth != null;
}
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if isAuthenticated();
}
match /publicdata/{document=**} {
allow read: if true;
}
}
}