firestore:PERMISSION_DENIED:缺少权限或权限不足

S R*_*khu 53 android firebase google-cloud-firestore

我收到了错误

gettingdocuments.com.google.firebase.firestore.FirebaseFirestoreException:PERMISSION_DENIED:权限丢失或不足.

对于else语句中的以下代码

db.collection("users")
        .get()
        .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                 if (task.isSuccessful()) {
                     for (DocumentSnapshot document : task.getResult()) {
                         s(document.getId() + " => " + document.getData());
                     }
                 } else {
                     s("Error getting documents."+ task.getException());
                 }
             }
         });
Run Code Online (Sandbox Code Playgroud)

Luv*_*nga 61

注意:这完全关闭了数据库的安全性,使其无需身份验证即可写入!这不是推荐的解决方案.

它对我有用.

进入数据库 - >规则 - >

改变allow read, write: if 错误; 真;

  • 这是一个可怕的解决方案,这实际上只是禁用安全性.请改为阅读:https://firebase.google.com/docs/firestore/security/get-started (54认同)
  • 请注意,它允许每个人在没有任何授权的情况下阅读,编写数据库. (24认同)
  • 快速入门的最佳解决方案。实际上,安全问题可以稍后解决。 (13认同)
  • 就像@DuncanLuk所说的,这是一个糟糕的解决方案。我什至不称其为解决方案 (7认同)
  • @ojonugwaochalifu,因为这对每个人都有效 (2认同)
  • 这不是一个解决方案。“我遇到了安全规则问题,让我们完全禁用它们吧!” (2认同)

Md *_*san 39

转到数据库 -> 规则

然后更改以下规则

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

到下面

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是个坏主意,这会使所有经过身份验证的用户都可以写所有文档,即使是属于其他用户的文档也只能由admin编写,或者根本不可写。请保留第一部分代码,因为它可以防止未实施的安全规则。 (4认同)
  • 这似乎是正确的解决方案。 (3认同)
  • 我想允许经过身份验证的用户(少数)访问所有文档,因此这个配方非常适合我的情况。 (3认同)
  • 请注意,如果您允许人们注册(例如使用 Google SSO),他们将自动有权访问您的所有数据。 (2认同)

Ssu*_*dra 18

以上投票的答案对您的数据库的健康是危险的。您仍然可以使您的数据库仅用于读取而不是用于写入:

  service cloud.firestore {
    match /databases/{database}/documents {
     match /{document=**} {
       allow read: if true;
       allow write: if false;
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 启用权限的正确方法是什么,但不适合所有人? (3认同)

小智 16

如果您在 Java Swing 应用程序中尝试。

  1. 前往Firebase Console> Project Overview>Project Settings

  2. 然后转到服务帐户选项卡,然后单击生成新的私钥。

  3. 您将获得一个 .json 文件,将其放置在已知路径中

  4. 然后转到我的电脑属性,高级系统设置,环境变量。

  5. GOOGLE_APPLICATION_CREDENTIALS使用您的 json 文件路径创建新的路径变量值。

  • 这也是我的问题,[文档](https://firebase.google.com/docs/admin/setup) 上有相关信息。 (2认同)

Ras*_*han 16

此处
将 false 更改为 true

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

并发布新规则

在此输入图像描述

  • 不要使用该解决方案。它允许任何用户从您的存储桶中读取和写入。 (5认同)
  • @JoeMoore 告诉我们一个正确的解决方案,而不是指出错误。 (4认同)

Pas*_*ghe 12

批准的答案非常危险,因为任何人都可以在未经任何许可的情况下读取或写入您的数据库。我建议使用这个。

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow write: if request.auth != null;
      allow read: if true;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这将允许授权人员写入数据库,而任何人都可以读取数据库,以防网站访问者。


xji*_*xji 10

指定安全规则后,我也遇到了“权限缺失或不足”的错误。事实证明,规则默认情况下不是递归的!即如果你写了一个规则

match /users/{userId} {
  allow read, write: if request.auth != null && request.auth.uid == userId;
}
Run Code Online (Sandbox Code Playgroud)

该规则不适用于 下的任何子集合/users/{userId}。这就是我错误的原因。

我通过将规则指定为:

match /users/{userId}/{document=**} {
  allow read, write: if request.auth != null && request.auth.uid == userId;
}
Run Code Online (Sandbox Code Playgroud)

在文档相关部分阅读更多信息


Moh*_*mal 9

用于开发和测试

从: 在此输入图像描述

到: 在此输入图像描述


Ang*_*oko 7

此外,如果代码中的集合引用与 firebase 上的集合名称不匹配,您可能会收到此错误。

例如,firebase 上的集合名称是,但您用或users引用它db.collection("Users")db.collection("user")

它也区分大小写。

希望这对某人有帮助


rwo*_*iak 7

因此,就我而言,我有以下数据库规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /stories/{story} {
      function isSignedIn() {
        return request.auth.uid != null;
      }

      allow read, write: if isSignedIn() && request.auth.uid == resource.data.uid
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如您所见uidstory文档上有一个标记所有者的字段。

然后在我的代码中,我查询了所有故事(Flutter):

Firestore.instance
          .collection('stories')
          .snapshots()
Run Code Online (Sandbox Code Playgroud)

它失败了,因为我已经通过不同的用户添加了一些故事。要解决此问题,您需要向查询中添加条件:

Firestore.instance
          .collection('stories')
          .where('uid', isEqualTo: user.uid)
          .snapshots()
Run Code Online (Sandbox Code Playgroud)

此处提供更多详细信息:https : //firebase.google.com/docs/firestore/security/rules-query

  • 这是最好的答案 (2认同)
  • 我收到“无效的变量名称:请求”。“request”应该是某个地方的参数参数吗? (2认同)

max*_*ndt 7

如果有人登陆这里尝试使用服务帐户访问 Firestore:

Service Account User除了Cloud Datastore UserGCP 的 IAM 设置中的角色之外,我还通过授予服务帐户角色解决了这个问题。


Jos*_*nce 7

有很多好的答案,但由于这是 Google 对 Firestore 权限被拒绝错误的最高响应,我想我应该为初学者和菜鸟添加一个答案。

为什么要制定安全规则?

如果您编写自己的后端,您会让用户向您的服务器询问某些内容,然后服务器将决定允许他们做什么。例如,您的服务器不允许 user1 删除 user2 的所有数据。

但由于您的用户直接与 Firebase 交互,因此您不能真正信任用户发送给您的任何内容。例如,用户 1 可以将其删除请求中的用户 ID 更改为“用户 2”。

Firestore 安全规则是您告诉 Firestore 又名后端服务器的地方,允许谁读取和写入哪些数据。

Firestore 团队的这段视频非常有帮助。

在此输入图像描述 https://www.youtube.com/watch?v=eW5MdE3ZcAw

如果您遇到“权限缺失或权限不足”错误,我强烈建议您观看该视频的完整 22 分钟,然后再尝试其他操作。

我从 1/10 到 7/10 了解了安全规则的工作原理,以及为什么我仅从这个视频中得到了错误。

入门指南也很有用,可以帮助回答视频未涵盖的问题。https://firebase.google.com/docs/firestore/security/get-started


itz*_*har 5

确保您的数据库不为空,或者您的查询是针对不存在的集合的

  • 此异常与空集合或数据库无关,这是一个权限问题 (11认同)
  • 在一个空的数据库上打个格,看看魔术。 (2认同)
  • 我和至少另外 3 个人在这种情况下有这种例外。如果这对您没有帮助,请继续执行下一个解决方案 (2认同)

小智 5

npm i --save firebase @angular/fire

在 app.module 确保你导入

import { AngularFireModule } from '@angular/fire';
import { AngularFirestoreModule } from '@angular/fire/firestore';
Run Code Online (Sandbox Code Playgroud)

在进口

AngularFireModule.initializeApp(environment.firebase),
    AngularFirestoreModule,
    AngularFireAuthModule,
Run Code Online (Sandbox Code Playgroud)

实时数据库规则确保你有

{
  /* Visit  rules. */
  "rules": {
    ".read": true,
    ".write": true
  }
}
Run Code Online (Sandbox Code Playgroud)

在云 Firestore 规则中确保你有

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)