236

我收到错误

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());
             }
         }
     });
4

23 回答 23

347

进入数据库 -> 规则 ->

对于开发:

改错allow read, write: if 真;

注意:它只是用于开发目的的快速解决方案,因为它会关闭所有安全性。因此,不建议用于生产。

对于生产:

如果从 firebase 进行身份验证:Change allow read, write: if false;request.auth != null;

于 2017-10-25T06:44:43.093 回答
118

转到数据库->规则

然后更改以下规则

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

到下面

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}
于 2019-01-30T16:17:09.073 回答
60

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

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
    }
  }
}

如您所见,文档uid上有一个字段story来标记所有者。

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

Firestore.instance
          .collection('stories')
          .snapshots()

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

Firestore.instance
          .collection('stories')
          .where('uid', isEqualTo: user.uid)
          .snapshots()

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

编辑:从链接

规则不是过滤器 在编写查询来检索文档时,请记住安全规则不是过滤器——查询是全部或全部。为了节省您的时间和资源,Cloud Firestore 会根据其潜在结果集而不是所有文档的实际字段值来评估查询。如果查询可能返回客户端无权读取的文档,则整个请求将失败。

于 2019-03-12T07:13:31.720 回答
19

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

  service cloud.firestore {
    match /databases/{database}/documents {
     match /{document=**} {
       allow read: if true;
       allow write: if false;
      }
   }
}
于 2019-08-27T09:15:16.893 回答
19

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

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

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

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

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

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

于 2019-09-24T08:53:32.587 回答
18

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

match /users/{userId} {
  allow read, write: if request.auth != null && request.auth.uid == userId;
}

该规则不适用于/users/{userId}. 这就是我犯错的原因。

我通过将规则指定为来修复它:

match /users/{userId}/{document=**} {
  allow read, write: if request.auth != null && request.auth.uid == userId;
}

在文档的相关部分阅读更多内容。

于 2020-09-16T23:21:35.873 回答
10

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

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

于 2020-05-14T12:49:52.930 回答
5

npm i --save firebase @angular/fire

在 app.module 中确保您已导入

import { AngularFireModule } from '@angular/fire';
import { AngularFirestoreModule } from '@angular/fire/firestore';

在进口

AngularFireModule.initializeApp(environment.firebase),
    AngularFirestoreModule,
    AngularFireAuthModule,

在实时数据库规则中确保你有

{
  /* Visit  rules. */
  "rules": {
    ".read": true,
    ".write": true
  }
}

在 Cloud Firestore 规则中确保你有

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}
于 2019-11-10T16:24:08.460 回答
4

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

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

它也区分大小写。

希望这可以帮助某人

于 2018-08-28T08:17:27.957 回答
4

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

于 2017-11-13T18:17:17.077 回答
3

Firebase Admin 出现此错误,解决方案是按照此链接正确配置 Firebase Admin

于 2020-04-02T19:15:54.590 回答
3

进入 Firestore 的数据库 > 规则:

rules_version = '2';
    service cloud.firestore {
      match /databases/{database}/documents {
        match /{document=**} {
          allow read, get: if true;
          allow write: if false;
      }
    }
}

更多信息:https ://firebase.google.com/docs/rules/rules-language?authuser=0

100% 工作到现在!

于 2021-06-03T19:35:18.257 回答
2

检查是否在IAM & Admin https://console.cloud.google.com/iam-admin/iam中添加了具有适当角色(例如 Editor )的服务帐户

于 2020-02-25T23:33:36.060 回答
2

目前,2020 年 6 月,默认情况下,firebase 是按时间定义的。定义满足您需求的时间。

allow read, write: if request.time < timestamp.date(2020, 7, 10);

请注意:您的数据库仍然对任何人开放。我建议,请阅读文档并以对您有用的方式配置数据库。

于 2020-06-11T13:00:10.883 回答
1

问题是您在用户通过身份验证之前尝试将数据读取或写入实时数据库或firestore。请尝试检查您的代码的范围。希望它有所帮助!

于 2020-03-28T08:47:41.767 回答
1

时间限制可能已经结束

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    // This rule allows anyone on the internet to view, edit, and delete
    // all data in your Firestore database. It is useful for getting
    // started, but it is configured to expire after 30 days because it
    // leaves your app open to attackers. At that time, all client
    // requests to your Firestore database will be denied.
    //
    // Make sure to write security rules for your app before that time, or else
    // your app will lose access to your Firestore database
    match /{document=**} {
      allow read, write: if request.time < timestamp.date(2020,7, 1);
    }
  }
}

今天在这一行有 更改日期:

 allow read, write: if request.time < timestamp.date(2020,7, 1);
于 2020-07-11T20:05:40.967 回答
1

也许你需要删除日期

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if
          request.time < timestamp.date(2021, 12, 12);
    }
  }
}
于 2021-12-13T15:20:22.787 回答
0

转到firebase中的规则并编辑规则.....(提供时间戳或设置为false)我的解决方案。

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.time < timestamp.date(2021, 8, 18);
    }
  }
}
于 2020-08-24T16:11:26.443 回答
0

转到 Apple 证书、标识符和配置文件:选择您的密钥上传 firebase 并进行检查:访问 DeviceCheck 和 AppAttest API 以获取您关联的数据

在此处输入图像描述

于 2022-01-04T12:49:53.460 回答
0

对我来说,这是日期的问题。更新了它,问题得到了解决。

允许读/写:

 if request.time < timestamp.date(2020, 5, 21);

编辑:如果您仍然感到困惑并且无法弄清楚问题所在,请查看您的 firebase 控制台中的规则部分。

于 2020-05-20T10:03:09.377 回答
0

https://console.firebase.google.com

开发 -> 数据库 -> 规则 -> 设置读、写 -> true

在此处输入图像描述

在此处输入图像描述

于 2020-03-17T10:22:49.997 回答
0

转到 firebase 控制台 => cloud firestore 数据库并添加允许用户读写的规则。

=> 允许读、写

于 2020-09-25T07:46:00.473 回答
-1

对于这种情况,您的规则应该是这样的,但是消息说这不是建议的方式,但是如果您这样做,您可以在没有权限错误的情况下进行插入

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}
于 2020-05-04T18:59:11.577 回答