Не работает функция get()
в правилах безопасности.
Возвращает разрешение, отклоненное клиенту, но проходит моделирование.
Схема конфигурации / прав доступа представляет собой структуру массива:
конфиг / разрешение ->
---------------------------> CollectionName1:
----------------------------------------------- -----> 0: UID1
----------------------------------------------- -----> 1: UID2
---------------------------> CollectionName2:
----------------------------------------------- -----> 0: UID3
----------------------------------------------- -----> 1: UID4
Я также пытался использовать отдельные поля ключ / значение в конфиге / разрешениях, так что
конфиг / разрешение ->
---------------------------> CollectionName1: UID1
---------------------------> CollectionName2: UID3
с правилом
allow read: if request.auth.uid == get(/config/permissions).data[c]
, и это прошло моделирование и не удалось в приложении. Если я жестко закодирую UID вместо request.auth.uid
, это даст тот же результат.
UID определенно правильно в приложении. Это было проверено с использованием следующего правила, где оно прошло в симуляции и приложении.
allow read: if request.auth.uid == 'USER_ID_HERE'
и путем сравнения вывода logcat UID с приведенным выше.
Пожалуйста, помогите. Это N-й день попытки найти подходящий способ структурирования и запроса Firestore. Я уверен, что это проблема либо с get()
вызовом, либо с тем, как я пишу вызов.
Код Android:
FirebaseFirestore db = FirebaseFirestore.getInstance();
FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
.setTimestampsInSnapshotsEnabled(true)
.build();
db.setFirestoreSettings(settings);
Log.d("UID", FirebaseAuth.getInstance().getCurrentUser().getUid());
DocumentReference docRef = db.collection(collection).document("X153@111");
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
Log.d("FIREBASE", "DocumentSnapshot data: " + document.getData());
} else {
Log.d("FIREBASE", "No such document");
}
} else {
Log.d("FIREBASE", "get failed with ", task.getException());
}
}
});