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


117

我遇到错误

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

用户登录了吗?
Suhayl SH

4
您是否已在Firebase控制台的“安全性”选项卡下设置规则?
Suhayl SH

1
我的错误,我没有看到Cloud Firestore的投递箱。我只在实时数据库中签入。
S Rekhu '17

感谢@SuhaylSH
S Rekhu

Answers:


170

它只是对我有用。

进入数据库->规则->

更改为allow read, write: if false;真实的;

注意:这完全关闭了数据库的安全性!

无需身份验证即可在世界范围内写入!!!这不是推荐用于生产环境的解决方案。仅将此用于测试目的。


42
请注意,它允许所有人在没有任何授权的情况下读写数据库。
Sai Gopi Me

102
这是一个可怕的解决方案,从字面上看只是禁用了安全性。请改为阅读以下内容:firebase.google.com/docs/firestore/security/get-started
Duncan Luk

2
@ojonugwaochalifu,因为这对每个人都有效
Luvnish Monga

11
就像@DuncanLuk所说的,这是一个糟糕的解决方案。我什至不称其为解决方案
Ojonugwa Jude Ochalifu,

6
真正快速入门的最佳解决方案。安全问题实际上可以稍后解决。
Viacheslav Dobromyslov

78

转到数据库 -> 规则

然后更改以下规则

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

8
这是一个坏主意,这会使所有经过身份验证的用户都可以写入所有文档,即使属于其他用户的东西也只能由管理员可以写入,或者根本不能写入。请保留第一部分代码,因为它可以防止未实施的安全规则。
Noxxys

1
请注意,如果您允许人们注册(例如,使用Google SSO),那么他们将自动访问您的所有数据。
ForrestLyman

2
我想允许经过身份验证的用户(少数)访问所有文档,因此该食谱非常适合我的情况。
AFD

1
这应该是公认的答案。
伊桑

19

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

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

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

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

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会根据查询的潜在结果集而不是所有文档的实际字段值来评估查询。如果查询可能返回客户端没有读取权限的文档,则整个请求将失败。


用户对象是什么?
Phani Rithvij

这是最佳答案
Elia Weiss

12

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

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

1
什么是启用权限的正确方法?
nyxee

8

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

  1. 转到Firebase Console> Project Overview>Project Settings

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

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

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

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


这也是我的问题,文档中提供了有关此信息。
tris timb

5

npm我-保存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
  }
}

在云存储规则中,请确保您拥有

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

3

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


8
此异常与空集合或数据库无关,这是一个权限问题
Ojonugwa Jude Ochalifu

此异常与空Db等无关。安全规则和Auth问题。
Rehan Ali,

在这种情况下,我和至少3个人有此例外。如果这对您没有帮助,请转到下一个解决方案
itzhar,

2

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

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

它也是区分大小写的。

希望这可以帮助某人


集合不是隐式创建的吗?在您的示例中,“用户”和“用户”集合将在引用时创建。
bdev TJ


@DevTJ,当它是一个addset请求时,您是正确的,但从问题上来说,它是一个get请求。我之前曾经历过
Anga

2

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

我通过在GCP的IAM设置中为角色授予服务帐户Service Account User角色来解决此问题Cloud Datastore User


2

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

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

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



1

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



1

对我来说,这是日期问题。更新了它,此问题已解决。

允许读/写:

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

编辑:如果您仍然感到困惑,无法找出问题所在,请查看Firebase控制台中的“规则”部分。


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);


-1

对于这种情况,您的规则应该是这样的,但是消息提示这不是建议的方式,但是如果您这样做,则可以进行插入而不会出现权限错误

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.