Разрешение Firestore отказано, несмотря на правила, соответствующие пути набора документов

У меня нет идей. Надеюсь, что свежий глаз может помочь.

У меня есть следующие правила безопасности:

function isUser (request, userKey) {
  return request.auth.uid == userKey;
}

function isAuthorized(request){
    return request.auth.uid != null;
}

function isAdmin (request) {
  return root.child('users').child(request.auth.uid).child('isAdmin').val() == true;
}

service cloud.firestore{
    match /databases/{database}/documents {
        match /users/{uid} {
          allow create: if isAuthorized(request) || isAdmin(request);
          allow update: if isUser(request, uid) || isAdmin(request);
        }

        match /userReadable/{objectType}/{uid} {
          allow read: if isUser(request, uid) || isAdmin(request);
          allow write: if isAdmin(request);
        }

        match /userWriteable/{objectType}/{uid} {
          allow read: if isAdmin(request);
          allow write: if isUser(request, uid) || isAdmin(request);
        }

        match /userOwned/{objectType}/{uid} {
          allow read: if isUser(request, uid) || isAdmin(request);
          allow write: if isUser(request, uid) || isAdmin(request);
        }
    }
}

Я устанавливаю документ в следующем коде:

 FirebaseFirestore db = getDB();
        PulseFirebaseModel pulse = new PulseFirebaseModel((PulseModel) object);
        try {
            final DocumentReference doc = db.collection(COLLECTION_USER_WRITABLE)
                    .document(OBJECT_PULSE_SAMPLE)
                    .collection(FirebaseApp.getInstance().getUid())
                    .document();

            doc.set(pulse, SetOptions.merge())
                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if(task.isSuccessful()){
                                Log.d(TAG, "Saved sample: " + doc.getId() +"\t"+doc.getPath());
                                onSuccess();
                            }else{
                                onFailure("Could not save Ppg\t"
                                        + task.getException().getMessage()
                                        + "\ndoc Path:" + doc.getPath()
                                        + "\ndoc id: " + doc.getId()
                                        + "\n" + task.getResult());
                            }
                        }
                    });
        } catch (FirebaseApiNotAvailableException e) {
            e.printStackTrace();
        }
    }

Я получаю следующее сообщение об отказе в разрешении:

PERMISSION_DENIED: Отсутствует или недостаточно разрешений.

путь к документу:userWriteable/pulseSample/xxxxx/Bba6pdgfMY98NmsAg1Hl

ID документа: Bba6pdgfMY98NmsAg1Hl

это мой UID, зарегистрированный FirebaseApp: Uid: xxxxx

/users/{uid} матч работает отлично. И я не реализовал другие 2 матча. Я посмотрел на этот вопрос, а также на этот, и я вошел в систему, и запрос отправлен с правильным request.auth.uid

Я просто не могу понять это. Любая помощь будет оценена.

1 ответ

Решение

Поскольку вы выполняете запись в автоматически сгенерированный идентификатор документа с помощью document (), ваши правила должны включать подстановочный знак для идентификатора документа в конце пути:

match /userWriteable/{objectType}/{uid}/{docId} { // <== added /{docId}
  allow read: if isAdmin(request);
  allow write: if isUser(request, uid) || isAdmin(request);
}
Другие вопросы по тегам