说我有一个users
集合,companies
集合和companyUserMemberships
集合。 users
和companies
彼此独立,并且companyUserMemberships
具有用户和公司字段(以及其他元数据,例如其权限级别)。例如,假设我们想将“帖子”添加到公司应用中。
我不知道的部分是如何对此进行验证。我希望公司中的任何人都可以阅读“帖子”,但不希望公司以外的人阅读,但是我还只希望发布者可以更新/删除。
似乎无法真正查询,因此到目前为止,我想出的最好的主意是将公司内的用户uid列表存储为map
类型,并且具有元数据并摆脱掉共companyUserMemberships
个。像这样:
我只是不确定这是否“正确”。嵌套感觉不正确,但是我不确定是否只是因为我来自SQL背景。
答案 0 :(得分:0)
我希望公司中的任何人都可以阅读“帖子”,但不要在外面阅读 公司,但我也只希望发布该信息的用户能够 更新/删除。
根据您的问题,我假设您具有以下要求:
1)用户可以为公司创建帖子,并更新/删除他/她创建的帖子。
Posts
收集所需的验证条件:
allow create:
用户是否已通过身份验证?allow update, delete:
用户是否已通过身份验证?帖子是由用户创建的吗?2)公司中的任何人都可以阅读为公司创建的帖子。
Posts
收集所需的验证条件:
allow read:
用户是否已通过身份验证?用户属于帖子的公司吗?您可以使用Cloud Firestore安全规则来实施这些验证,而无需companyUserMemberships
集合。
我假设在posts
集合中创建的文档在字段createdBy
中具有有关帖子作者的信息,在字段company
中具有有关帖子的公司名称的信息。
service cloud.firestore {
match /databases/{database}/documents {
//Get the user using uid
function getUser() {
return(get(/databases/$(database)/documents/users/$(request.auth.uid)).data);
}
//Check if user exists
function isValidUser(user) {
//Validate the necessary privileges
return (user != null);
}
// Check access for Posts
match /posts/{postId} {
// Any authorized user of a company can read posts for the company
allow read: if ( isValidUser(getUser()) && resource.data.company == getUser().company)
// Any authorized user can create a post
allow create: if ( isValidUser(getUser()));
// Any authorized user can update and delete his/her a post only
allow update, delete: if ( isValidUser(getUser()) && request.resource.createdBy == getUser().uid);
}
}
}
希望这会有所帮助。