【发布时间】:2020-02-01 15:36:25
【问题描述】:
我正在尝试为我的 Firestore 项目实施安全规则。这里的声明不起作用,谁能告诉我为什么?我现在一头雾水。
我想要实现的目标:如果该用户在用户列表中,则该用户只能读取该用户列表。
match /databases/{database}/documents {
match /groups/{group}/userlist/{document=**}{
allow read: if exists(/databases/$(database)/groups/$(group)/userlist/$(request.auth.uid));
//for troubleshooting: the general rule below works fine and access is granted
//allow read :if request.auth.uid != null;
}
}
这是来自我的应用程序的代码示例,其中未授予使用所述语句的访问权限。正如我在“规则”代码中的注释行中所说:当我将规则设置为更一般的访问条件时,我会得到结果。
以下代码来自适配器中的 onBind。为了确定,我添加了一行打印 uid。
System.out.println("UserId: "+ mAuth.getCurrentUser().getUid());
db.collection("groups").document(model.getGroupId()).collection("userlist").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
int members = queryDocumentSnapshots.size();
holder.mPreviewText.setText("Number of Members: " + members);
}
});
I/System.out: UserId: iWBdGRNmJCOEtXWKefeD2T7cH1l2
I/System.out: UserId: iWBdGRNmJCOEtXWKefeD2T7cH1l2
I/System.out: UserId: iWBdGRNmJCOEtXWKefeD2T7cH1l2
I/System.out: 1
I/System.out: UserId: iWBdGRNmJCOEtXWKefeD2T7cH1l2
W/Firestore: (21.3.1) [Firestore]: Listen for Query(target=Query(groups/uaRV4n21PWov5p6VPlYH/userlist order by __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
I/System.out: UserId: iWBdGRNmJCOEtXWKefeD2T7cH1l2
I/System.out: UserId: iWBdGRNmJCOEtXWKefeD2T7cH1l2
W/Firestore: (21.3.1) [Firestore]: Listen for Query(target=Query(groups/tqsFIMhaMdZUfx6M3Guz/userlist order by __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
I/System.out: UserId: iWBdGRNmJCOEtXWKefeD2T7cH1l2
I/System.out: UserId: iWBdGRNmJCOEtXWKefeD2T7cH1l2
W/Firestore: (21.3.1) [Firestore]: Listen for Query(target=Query(groups/tm09NSiqZ5rDaBZzH52g/userlist order by __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
W/Firestore: (21.3.1) [Firestore]: Listen for Query(target=Query(groups/iye5A0JaltId8xYeQLie/userlist order by __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
W/Firestore: (21.3.1) [Firestore]: Listen for Query(target=Query(groups/cnj4BOMHY0LlXb7KJsW0/userlist order by __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
W/Firestore: (21.3.1) [Firestore]: Listen for Query(target=Query(groups/UGmozZfEOKXX1sajT1NW/userlist order by __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
W/Firestore: (21.3.1) [Firestore]: Listen for Query(target=Query(groups/S4lJIyAMfDtQUTS08PWa/userlist order by __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
W/Firestore: (21.3.1) [Firestore]: Listen for Query(target=Query(groups/uaRV4n21PWov5p6VPlYH/userlist order by __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
W/Firestore: (21.3.1) [Firestore]: Listen for Query(target=Query(groups/tqsFIMhaMdZUfx6M3Guz/userlist order by __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
我阅读了所有文档,这就是我认为代码应该看起来的样子,但它不起作用,列表中的用户没有读取权限。
Query(target=Query(groups/uaRV4n21PWov5p6VPlYH/userlist order by __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
【问题讨论】:
-
"此语句不起作用" 您能否编辑您的问题以显示您运行的不违反这些规则的最小、完整代码?鉴于您正在检查另一个文档是否存在,查看您正在检查的文档的屏幕截图也会很有帮助。
-
不确定你想看什么截图。控制台内的文档?
-
我们无法确定 1) 用户使用 UID 登录和 2) 具有 UID 的文档存在于正确的集合中。如果无法验证这些事实,我们将无法提供太多帮助,因为这些正是您的规则试图验证的内容。
-
好的,但是代码本身没问题?我特别询问该代码对于我描述的目的是否正确,因为我不熟悉 Firebase 安全规则。但是我不需要帮助来检查我的数据库中是否存在文档......并且用户使用 uid 登录为“允许读取:如果 request.auth.uid != null”工作正常。
-
感谢您提供额外的代码。乍一看,该代码看起来不错,所以我们现在只能说
if exists(/databases/$(database)/groups/$(group)/userlist/$(request.auth.uid))确实似乎失败了。您将要检查该文档是否确实存在于控制台中。为了让我们帮助您进行仔细检查,请在您的问题中发布相关的屏幕截图。
标签: android firebase google-cloud-firestore firebase-security