我正在开发一个可以跟随/取消关注其他应用程序用户的应用程序。因此,在Firestore中,我有一个用户集合,每个用户都包含一个名为followers的属性。 Followers是一组userId。
赞:
"users": {
"user1": {
"name": "Jack",
"imageUrl": "http://lorempixel.nl",
"followers": ["user1", "user2"]
}
}
问题
如何在Firestore中编写安全规则,因此只有当前用户才能读取/写入自己的对象,而其他用户则可以将其用户ID添加/删除到关注者数组中。
答案 0 :(得分:1)
要使人们能够关注/取消关注用户,这组安全规则应适用于您的数据结构。基本表示他们不能更改其他数据,并且有3条规则:
如果他们在遵循文档后立即更新文档,则无法对其进行修改。
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
allow update: if
resource.data.name == request.resource.data.name &&
resource.data.imageUrl == request.resource.data.imageUrl &&
request.resource.data.size() == resource.data.size() &&
(
(
// If user adding their uid
request.resource.data.followers.hasAll(resource.data.followers) &&
request.resource.data.followers.hasAll([request.auth.uid]) &&
request.resource.data.followers.size() == resource.data.followers.size() + 1
) ||
(
// If user removing their uid
resource.data.followers.hasAll(request.resource.data.followers) &&
resource.data.followers.hasAll([request.auth.uid]) &&
!request.resource.data.followers.hasAll([request.auth.uid]) &&
request.resource.data.followers.size() == resource.data.followers.size() - 1
) ||
(
// If user tries updating whilst already a follower
request.resource.data.followers.hasAll(resource.data.followers) &&
request.resource.data.followers.size() == resource.data.followers.size()
)
)
}
}
}
我已经在Firebase控制台的规则模拟器中对其进行了测试,因此应该可以正常工作,但请进行广泛的测试。感觉很hacky,拥有支持阵列删除的特定规则绝对是一件好事,但我相信这同时应该做到。