返回

Firebase Firestore PERMISSION_DENIED 错误修复指南:恢复对数据访问权

Android

修复 Firebase Firestore PERMISSION_DENIED 错误的终极指南

简介

在使用 Firebase Firestore 读写数据时,您可能会遇到烦人的 PERMISSION_DENIED 错误。本指南将深入探讨导致此错误的原因,并提供全面的解决方案,帮助您恢复对 Firestore 数据的访问权限。

错误的原因

PERMISSION_DENIED 错误表明您没有足够的权限来访问请求的文档或集合。这通常是由于以下原因之一:

  • 安全规则未正确配置: Firestore 安全规则决定了用户可以访问哪些数据。
  • 用户未经身份验证: 匿名用户或未登录的用户没有权限访问受保护的数据。
  • 规则匹配不正确: 安全规则应与要访问的文档或集合的路径相匹配。

解决方法

1. 检查安全规则

  • 前往 Firebase 控制台,点击“Firestore”选项卡。
  • 转到“规则”部分,并检查安全规则是否允许用户访问您要查询的集合和文档。

2. 授权用户

  • 对于匿名用户,请调用 Firebase.auth().signInAnonymously()
  • 对于已登录用户,请调用 Firebase.auth().signInWithCredential()

3. 设置读写规则

在安全规则中添加以下规则,允许所有经过身份验证的用户读写数据:

match /databases/{database}/documents {
  match /users/{userId} {
    allow read, write: if request.auth.uid == userId;
  }
}

4. 检查规则匹配

确保安全规则与要访问的文档或集合的路径匹配。例如,如果要访问 /users/alice/messages,安全规则应如下所示:

match /databases/{database}/documents {
  match /users/alice/messages {
    allow read, write: if request.auth.uid == userId;
  }
}

5. 重新加载规则

更新安全规则后,请重新加载它们以确保它们已应用。

代码示例

db.collection("users")
    .get()
    .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
             if (task.isSuccessful()) {
                 for (DocumentSnapshot document : task.getResult()) {
                     System.out.println(document.getId() + " => " + document.getData());
                 }
             } else {
                 if (task.getException() instanceof FirebaseAuthException) {
                     // 用户未登录或身份验证凭据无效
                 } else if (task.getException() instanceof FirestoreException) {
                     // 权限不足或安全规则禁止访问
                 } else {
                     // 其他错误
                 }
             }
         }
     });

结论

通过遵循本指南中概述的步骤,您可以解决 Firebase Firestore PERMISSION_DENIED 错误并恢复对所需数据的访问权限。请记住,安全规则是确保数据安全性的关键,因此在更新它们时要小心谨慎。

常见问题解答

1. 如何检查用户是否已经登录?

使用 Firebase.auth().getCurrentUser() 来检查当前登录的用户。

2. 为什么我的安全规则无效?

确保规则正确格式化,并且与要访问的文档或集合的路径匹配。

3. 如何更改匿名用户的权限?

调用 Firebase.auth().signInAnonymously() 后,使用 Firebase.auth().currentUser.getIdToken(true) 来获取用户令牌。

4. 如何在代码中处理权限错误?

使用 try-catch 块来捕获 FirestoreException,并根据错误类型相应地处理。

5. 如何授予管理员所有权限?

在安全规则中添加以下规则:

allow read, write: if request.auth.uid == "admin-uid";