Я пытаюсь добавить правила безопасности в новый проект 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 в моей фактической базе данных, поэтому при входе в систему под именем userId пользователя я мог бы ожидать, что пользователь сможет прочитать документ userId1 и friendId2. пользователи.
У меня проблема в том, что isFriendOf
возвращает false. Я пробовал несколько вариантов упаковки данных сравнения в вызове get
и передачи других значений, таких как id
и data
, из возвращаемого ресурса.
Я также пытался обернуть вызов getUserPath
в isFriendOf
в get
и затем использовать свойство __name__
документа в качестве значения для сравнения. Там тоже не повезло.
Любая помощь будет принята с благодарностью.
Редактировать: включая скриншот фактических документов для уточнения.
Снимок экрана с документами Firebase
Редактировать 2: Я сделал чистый проект Firebase с информацией только на этих новых скриншотах. Я включаю снимки экрана со страницей аутентификации Firebase, обе записи пользователей в базе данных, а также сбой симулятора, запущенного одним пользователем, пытающимся получить документ другого пользователя.
Конфигурация аутентификации
user1
user2
Имитация запроса