【发布时间】:2020-06-29 13:06:25
【问题描述】:
我正在开发一个包含测验文档的应用程序 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');
...
}
这些规则无法正常工作。
示例: id 为 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);
}
}
});
【问题讨论】:
-
“这些规则无法正常工作。”请编辑您的问题以包含规则无法正常工作的示例。
-
您的问题应该包括您正在使用的实际数据以及尝试使用该数据的客户端应用程序代码。如果没有所有这些信息,很难判断可能出了什么问题。
标签: android firebase google-cloud-firestore firebase-security