Я работаю над базой данных Firestore, в которой есть документы викторины. каждый документ может иметь поле строкового массива с именем peopleCanAccess.
Что я хочу сделать в правилах? Если в документе есть это поле (peopleCanAccess), в peopleCanAccess могут существовать только люди, способные прочитать документ. и если это поле не существует, все аутентифицированные люди могут получить к нему доступ.
Я пытался:
function existingData() {
return resource.data;
}
function isAuthenticated() {
return request.auth != null;
}
function getUid() {
return request.auth.uid;
}
function fieldExists(data, field) {
return !isUndefined(data, field) && !isNull(data, field);
}
function isUndefined(data, field) {
return !data.keys().hasAll([field]);
}
function isNull(data, field) {
return data[field] == null;
}
match /quiz/{quizID}{
allow read : if
(isAuthenticated() && existingData().owner == getUid())
|| (isAuthenticated() && !('peopleCanAccess' in existingData().keys()))
|| (isAuthenticated() && getUid() in existingData().peopleCanAccess)
// !fieldExists(resource.data, 'peopleCanAccess');
...
}
Эти правила не работают правильно.
пример: пользователь с идентификатором tcsFStMdplOJSyZsluJBLHeOuJs1 может получить доступ к опросу, указанному на изображении выше, хотя его нет в поле peopleCanAccess
запрос:
db.collection("quiz")
.whereEqualTo("id", quizId)
.get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
if (queryDocumentSnapshots.isEmpty()){
}else {
QuizItem quizItem = queryDocumentSnapshots.getDocuments().get(0).toObject(QuizItem.class);
accessedQuiz.postValue(quizItem);
}
}
});