Разрешение 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);
}