У меня есть приложение Android (Kotlin) (min SDK версия 26), которое использует Google Firebase. В частности, я использую Firestore. У меня есть правило, которое работает на игровой площадке, но не из моего приложения, и я не могу понять, почему.
Вот правило, о котором идет речь:
match /events/{eventId}
allow delete, update: if get(/databases/$(database)/documents/organisations/$(resource.data.organisationId)).data.access[request.auth.uid] == 'admin'
}
А вот код вызова:
db.collection("events").document(event.id)
.delete()
.addOnSuccessListener { _ ->
}
.addOnFailureListener { deleteResult ->
println("-----> FAIL DELETE EVENT: $deleteResult")
}
Как вы можете сказать из правила, разрешения для события определяются ролью пользователя в родительской организации события. В этом случае я использую одного и того же пользователя на игровой площадке правил и внутри приложения, поэтому проблем с разрешениями определенно не существует. У меня такое ощущение, что эта проблема как-то связана с "правила не являются фильтрами" , но я не совсем уверен, что изменить ...
Спасибо
ОБНОВЛЕНО, чтобы включить скриншоты базы данных и UID ниже:
Ниже показано, как я извлекаю все события для указанных c organisationId
и l oop поверх тех, которые нужно удалить. Перед удалением я печатаю пользовательские auth.uid
, eventId
и organisationId
.
db.collection("events")
.whereEqualTo("organisationId", selectedOrganisationId)
.get()
.addOnSuccessListener { result ->
for (event in result) {
println("------ USER UID: ${currentUser?.uid}, EVENT ID: ${event.id} , ORG ID: ${event.get("organisationId")}")
db.collection("events").document(event.id)
.delete()
.addOnSuccessListener { _ ->
}
.addOnFailureListener { deleteResult ->
println("-----> FAIL DELETE EVENT: $deleteResult")
}
}
}
.addOnFailureListener { result ->
println("-----> FAIL GET EVENTS TO DELETE: $result")
}
Ниже показан вывод println
, содержащий идентификаторы:
I / System.out: ------ UID пользователя: lCagHz9IFSUoGp6eBhrr70HgUOp2, идентификатор события: gkf7FRq0gP0wHiCqhTVE, идентификатор ORG: Wh1YkTmWptuDtaMKb2k6
10: 10 * *1029* 1030 1030
I / System.out: -----> СОБЫТИЕ УДАЛИТЬ СБОЙ: com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: отсутствуют или отсутствуют разрешения.
Вот некоторые скриншоты базы данных Firestore, в которых показаны существующие идентификаторы и структура:
Еще одно обновление: просто быстро отметим, что если я изменю правило на allow delete, update: if true
, правильные события будут удалены. Поэтому я абсолютно точно пытаюсь удалить правильные документы.