[英]Firestore security rules : searching for a user's id in array in a document
首先,对不起我糟糕的英语,它不是我的母语......
我正在 Firebase 中使用 Firestore 数据库构建一个简单的应用程序。 在我的应用程序中,用户是小组的成员。 他们可以访问其他用户的数据。 为了不查询太多文档(每个用户一个,在组文档的子集合中),我选择将用户数据添加到组文档内的数组中。 这是我小组的文件:
{
"name":"fefefefe",
"days":[false,false,false,false,true],
"members":[
{"email":"eee@ff.com","id":"aaaaaaaa","name":"Mavireck"},
{"email":"eee2@ff.com","id":"bbbbbbbb","name":"Mavireck2"},
],
}
如果用户在组中,我如何检查安全规则? 我应该改用 object 吗? 我真的不想为用户使用子集合,因为我会很快达到免费配额的限制......
感谢您的时间 !
编辑:感谢您的回答。 我会把它改成 object: "Members": { uid1: {}, uid2: {} }
通常,您需要编写如下规则:
service cloud.firestore {
match /databases/{database}/documents {
match /collection/{documentId} {
// works if `members` = [uid1, uid2, uid3]
// no way to iterate over a collection and check members
allow read: if request.auth.uid in resource.data.members;
// you could also have `members` = {uid1: {}, uid2: {}}
allow read: if resource.data.members[request.auth.uid] != null;
}
}
}
您还可以使用子集合:
service cloud.firestore {
match /databases/{database}/documents {
// Allow a user to read a message if the user is in the room
match /rooms/{roomId} {
match /documents/{documentId} {
allow read: if exists(/databases/$(database)/documents/documents/$(documentId)/users/$(request.auth.uid));
}
match /users/{userId} {
// rules to allow users to operate on a document
}
}
}
}
我用这段代码让它发生了
如果同一用户存在于另一个集合的数组中,则允许某些用户读取/写入集合的某些文档
service cloud.firestore {
match /databases/{database}/documents {
match /repositories/{accountId} {
allow read, write: if request.auth.uid in get(/databases/$(database)/documents/accounts/$(accountId)).data.users
}
}
}
只是提供一个替代解决方案。 在我的例子中,我存储了两个单独的字段。 在您的情况下,它将是:
"membersSummary":[
{"email":"eee@ff.com","id":"aaaaaaaa","name":"Mavireck"},
{"email":"eee2@ff.com","id":"bbbbbbbb","name":"Mavireck2"},
],
"members": ["aaaaaaaa", "bbbbbbbb"]
我知道这不一定是最佳的,但由于我们使用的是 firebase,所以我认为我们可以在文档中使用非规范化数据。
我将使用members
字段进行集合查询和 firestore 规则( allow read: if request.auth.uid in resource.data.members;
根据上面 Mike 的回答),以及membersSummary
用于在 UI 中呈现信息或使用其他类型处理的附加字段。
如果你使用 uid 作为键,那么如果你想查询一个集合并列出该用户所属的所有文档,并按名称对它们进行排序,那么 firebase 将需要为每个 uid 单独的复合索引,除非你有一个固定的一组用户(极不可能)基本上会导致您的应用程序崩溃。
我真的不喜欢仅仅为了访问控制而读取额外文档的想法,但如果您更喜欢这种方法来跟踪两个独立的相关字段,那么就这样做吧。 没有完美的解决方案——只是提供另一种可能性,各有利弊。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.