我认为Firebase Rules可能是一个简单的问题,但是我似乎无法使它正常工作。我有一个“公司”文档,里面有多个子集合。我想建立一个规则来检查“公司”文档中数组中的管理员(每个数组项都是firebase userId的字符串),并允许他们读取/写入该文档的所有子集合。
这是单个公司文档中的数据结构:
company1 {
admins: ["userid1", "userid2", "userid3"],
}
这是我的火力场规则:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /companies/{company}/{document=**} {
allow read, write: if request.auth.uid in get(/databases/$(database)/documents/companies/$(company)).data.admins
}
}
}
下面是一个查询示例,该查询在以下情况下不起作用:
let ref = db.collection("companies");
//get current users company
ref
.where("admins", "array-contains", firebase.auth().currentUser.uid)
.get()
.then((snapshot) => {
snapshot.forEach((doc) => {
this.company = doc.data();
this.company.id = doc.id;
});
});
我希望我的问题有道理:)
答案 0 :(得分:0)
我找到了答案,希望它对可能遇到此问题的人有所帮助。
我最终调整了数据结构,以将公司文档ID作为字段包含在用户文档中。然后,我创建了以下规则,以允许用户基于Firebase身份验证来读取/写入自己的用户文档,以及基于用户文档中的字段来读取/写入公司:
service cloud.firestore {
match /databases/{database}/documents {
// Allow users to create and edit the document for themselves in the users collection
match /users/{user} {
allow read, write: if request.auth.uid == user;
}
// Allow users to create a company for themselves upon signup
match /companies/{company} {
allow create: if request.auth.uid != null
}
match /companies/{company}/{document=**} {
// Allow users to read/write data on thier own companies
allow read, write: if company in get(/databases/$(database)/documents/users/$(request.auth.uid)).data.companies
}
}
}