У меня есть коллекция Firestore с именем UserProfiles, в которой хранится информация о профиле каждого пользователя в отдельных документах. Каждый документ назван по идентификатору пользователя, которому он принадлежит. Каждый документ также содержит несколько вложенных коллекций. Я хотел бы создать правила, дающие каждому пользователю возможность читать и писать свой собственный документ и вложенные коллекции ТОЛЬКО под его документом. Однако, когда пользователь пытается прочитать документ своего профиля, я продолжаю получать следующее сообщение об ошибке:
Ошибка при получении документов: Error Domain = FIRFirestoreErrorDomain Code = 7 «Отсутствуют или недостаточно разрешений». UserInfo = {NSLocalizedDescription = Отсутствуют или недостаточно разрешений.}
Вот созданное мной правило:
service cloud.firestore {
match /databases/{database}/documents {
//grant users read and write access to anything under own profiles collection
match /UserProfiles/{userId}/{document=**} {
allow read, write: if request.auth.uid == userId;
}
//grant users read and write access to their own profile document
match /UserProfiles/{userId} {
allow read, write: if request.auth.uid == userId;
}
}
}
Благодарен, если кто-нибудь может указать, где я ошибся - Спасибо !
РЕДАКТИРОВАТЬ: Извините - вот код на стороне клиента в Swift:
let firebaseAuth = Auth.auth()
if firebaseAuth.currentUser != nil {
userUId = Auth.auth().currentUser!.uid
print("User id is \(String(describing: userUId))")
} else {
print("User is not currently logged in")
return
}
//Getting my user info
db.collection("UserProfiles").whereField("user_id", isEqualTo: self.userUId).getDocuments() { (snapshot, error) in
if let error = error {
print("Error getting documents in func viewWIllAppear with user id \(self.userUId): \(error)")
} else {
print("Successful db connection")
for document in snapshot!.documents {
self.myUserHandle = document["user_handle"]! as! String
print("Retrieved user handle is \(self.myUserHandle)")
}
}
}
И структура базы данных:
UserProfiles
|
|--FHEneuY3nron3Ns2Ndl1SGdg9Nsw
|
|--UserHistory
|
|--UserReports
|
|--UserLogs
В основном то, что я хочу для выполнения моих правил необходимо предоставить зарегистрированному пользователю права на чтение и запись в его собственном документе профиля, который представляет собой имена с его идентификатором пользователя (FHEneuY3nron3Ns2Ndl1SGdg9Nsw), а также для вложенных коллекций под ним (UserHistory, UserReports и UserLogs), но не разрешать пользователям для чтения или записи в документы профиля другого пользователя или их подколлекции.
А вот результат вывода на консоль:
идентификатор пользователя - FHEneuY3nron3Ns2Ndl1SGdg9Nsw
2020 -05-26 18: 53: 58.560680-0400 MealFleet [2495: 1086294] 6.2.0 - [Firebase / Firestore] [I-FST000001] Не удалось прослушать запрос в UserProfiles: отсутствует или отсутствует необходимые разрешения. Ошибка получения забавных документов c viewWIllAppear с идентификатором пользователя FHEneuY3nron3Ns2Ndl1SGdg9Nsw: Error Domain = FIRFirestoreErrorDomain Code = 7 «Разрешения отсутствуют или недостаточно». UserInfo = {NSLocalizedDescription = Отсутствующие или недостаточные разрешения.}
ОБНОВЛЕНИЕ: вот исправленный запрос, благодаря Дугу за указание на мою ошибку:
db.collection("UserProfiles").document(self.userUId).getDocument() { (document, error) in
if let document = document, document.exists {
let dataDescription = document.data()
self.myUserHandle = (dataDescription!["user_handle"] as? String)!
print("Retrieved user handle is \(self.myUserHandle)")
} else {
print("Error getting documents in func viewWIllAppear with user id \(self.userUId): \(error)")
}
}