Firebase 如何";加入;火场规则
假设我有一个Firebase 如何";加入;火场规则,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,假设我有一个users集合、companys集合和companyUserMemberships集合用户和公司彼此独立,并且公司成员资格有一个用户和公司字段(以及其他元数据,如其权限级别)。例如,假设我们想在公司应用程序中添加“posts” 我想不出的部分是如何用它进行验证。我希望公司内的任何人都能阅读“帖子”,但不希望公司外的人阅读,但我也只希望发布帖子的用户能够更新/删除 似乎无法进行真正的查询,因此到目前为止,我想到的最好的办法是将公司内部的用户UID列表存储为映射类型,该类型具有元数据,并
users
集合、companys
集合和companyUserMemberships
集合<代码>用户和公司
彼此独立,并且公司成员资格
有一个用户和公司字段(以及其他元数据,如其权限级别)。例如,假设我们想在公司应用程序中添加“posts”
我想不出的部分是如何用它进行验证。我希望公司内的任何人都能阅读“帖子”,但不希望公司外的人阅读,但我也只希望发布帖子的用户能够更新/删除
似乎无法进行真正的查询,因此到目前为止,我想到的最好的办法是将公司内部的用户UID列表存储为映射
类型,该类型具有元数据,并完全消除公司成员身份
。大概是这样的:
我只是不确定这是否“正确”。嵌套只是感觉不正确,但我不确定这是否只是因为我来自SQL背景
我希望公司里的任何人都能读到这篇文章,但外面的人不行
公司,但我也只希望发布的用户能够
更新/删除
根据你的问题,我假设你有以下要求:
1) 用户可以为公司创建帖子,并更新/删除自己创建的帖子
帖子所需的验证
收集:
允许创建:
用户是否经过身份验证允许更新、删除:
用户是否经过身份验证?帖子是否由用户创建帖子所需的验证
收集:
允许读取:
用户是否经过身份验证?用户是否属于该职位的公司公司成员资格
集合
我假设在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);
}
}
}
希望这有帮助。在firebase规则中,对于这种情况,我认为您需要嵌套,以便集合上方的规则或外部嵌套规则集合上方的id可以应用于内部嵌套规则。你可以这样研究。