我正在尝试将安全性规则添加到我正在处理的新Firestore项目中。我有一个名为users
的集合,其中所有用户数据都以这种格式存储在Firestore数据库中:
var users = {
"userId": {
friend_requests: [],
friends: [
/users/friendId1,
/users/friendId2
],
name: "User One",
username: "user1"
},
"friendId1": {
friend_requests: [],
friends: [
/users/userId
],
name: "User Two",
username: "user2"
},
"friendId2": {
friend_requests: [],
friends: [
/users/userId
],
name: "User Three",
username: "user3"
},
"lonelyUser": {
friend_requests: [],
friends: [],
name: "Lonely User",
username: "lonely_user"
}
}
我的Firestore规则是逐字记录的:
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
match /users/{userId} {
allow read: if isOwner(userId) || isFriendOf(userId);
}
}
function isOwner(userId) {
return userId == currentUser().uid;
}
function isFriendOf(userId) {
return getUserPath(userId) in getUserData().friends;
}
function currentUser() {
return request.auth;
}
function getUserData() {
return get(getUserPath(currentUser().uid)).data;
}
function getUserPath(userId) {
return /databases/$(database)/documents/users/$(userId);
}
}
我在上面概述的地图中的键是实际数据库中的Firebase用户ID,因此当以用户“ userId”身份登录时,我希望能够读取“ friendId1”和“ friendId2”的用户文档用户。
我遇到的问题是isFriendOf
返回的是false。我尝试了几种变体,将比较数据包装在get
调用中,并从返回的资源中传入其他值,例如id
和data
。
我还尝试将getUserPath
中的isFriendOf
调用包装在get
中,然后也将文档的__name__
属性用作比较值。那里也没有运气。
任何帮助将不胜感激。
编辑:包括用于澄清的实际文档的屏幕截图。
Screenshot of Firebase Documents
编辑2:我制作了一个干净的firebase项目,其中仅包含这些新屏幕截图中的信息。我包括Firebase身份验证页面的屏幕快照,数据库中的两个用户条目以及一个失败的模拟器,一个用户试图获取另一用户的文档而运行。