我正在努力着手编写更复杂的Firestore安全规则。例如,规则可能取决于动态需要考虑的不同集合中的文档。
项目集合:
-如果登录的用户角色===“ LEVEL_1”(每个用户个人资料都包含在 Users 集合中)并且通过 AssignedProjects
Allow read if auth.uid ==== Users.reference === AssignedProjects.userReference === <Current Request’s project reference(s)>
评论集:
-如果用户参与了某个项目,则可以对其发表评论
Allow write if <Current Request’s Comment.postReference> === Posts.projectReference <=> AssignedProjects.projectReference && AssignedProjects.visibleToRoles.contains(auth.uid === Users.role)
我已经尝试过根据此示例使用函数进行此操作,但是到目前为止,我只检索到了User文档,但这是我需要动态引用的内容,例如Posts和Projects令我感到困惑。
任何人都可以帮我写上面两个可以用作基础的书吗?
这些规则是让我无法使用Firestore的唯一原因,因为滚动完整的API和关系数据库对于测试想法而言是过大的。
这是我到目前为止所拥有的:
service cloud.firestore {
match /databases/{database}/documents {
function isLoggedIn() {
return request.auth != null;
}
function isAdmin() {
return get(/databases/$(database)/documents/users/{document=**}).data.role == "ADMIN";
}
function isUser() {
return get(/databases/$(database)/documents/users/{document=**}).data.role == "USER";
}
match /configuration/{document} {
allow read;
allow create: if (isLoggedIn() == true && isAdmin() == true);
allow write: if (isLoggedIn() == true && isAdmin() == true);
allow delete: if (isLoggedIn() == true && isAdmin() == true);
}
match /registrationInvitations/{invite=**} {
function inviteData() {
return get(/databases/$(database)/documents/registrationInvitations/$(invite)).data
}
allow create: if (isLoggedIn() == true && isAdmin() == true);
allow read;
allow write: if inviteData().invitationCode == request.resource.invitationCode && isLoggedIn() == false;
allow delete: if (isLoggedIn() == true && isAdmin() == true);
}
match /users/{user=**} {
function userData() {
return get(/databases/$(database)/documents/users/$(user)).data
}
allow create: if (isLoggedIn() == true && isAdmin() == true);
allow read: if userData().uid == request.auth.uid;
allow write: if request.resource.uid == request.auth.uid && isAdmin() == false
|| isAdmin();
allow create: if request.resource.uid == request.auth.uid && isAdmin() == false
|| isAdmin();
allow create, read, write, update, delete;
}
match /companies/{company=**} {
allow create, read, write, update, delete;
}
}
}