Firebase数据库权限被拒绝,读/写权限设置为true

时间:2016-05-24 21:53:01

标签: android firebase firebase-realtime-database

我在简单的Android应用中写入Firebase数据库时遇到问题。我已将数据库规则设置为公开:

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

创建了一个简单的类Message

import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

public class Message {
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference dbRef = database.getReference();
    public String sender;
    public String message;

    public Message(){}

    public Message(String sender, String message) {
        this.sender = sender;
        this.message = message;
    }
}

并设置一个按钮来执行onClick方法writeNewMessage,其中这些是重要的代码行:

int counter = 0;

public void writeNewMessage(View view) {

        counter += 1;
        Message messageToWrite = new Message("John", "Simple message: " + counter);
        String messageId = String.valueOf(counter);

        dbRef.child("users").child(messageId).setValue(messageToWrite);
    }

运行时,我收到错误:

W/RepoOperation: setValue at /users/1 failed: DatabaseError: Permission denied

我知道这个问题看起来很简单并且可能已经重复了,但是我还没有找到任何问题来解决这个问题,而不会将其错误包含在身份验证或其他组件中。这个问题的简单性让我感到困惑。

编辑:我也发现了这个错误:

Failed to load module descriptor class: Didn't find class "com.google.android.gms.dynamite.descriptors.com.google.firebase.auth.ModuleDescriptor"

7 个答案:

答案 0 :(得分:24)

完整解决方案 1)。首先转到身份验证选项卡,然后选择 SIGN-IN-METHOD 将匿名打开 2)。其次,转到数据库选项卡并编写规则{ "rules": { ".read": true, ".write": true }} 3)。第三步,转到存储选项卡并编写以下规则

service firebase.storage {
 match /b/myapplicationname-f2266.appspot.com/o {
 match /{allPaths=**} {
 allow read, write;
}}}

注意此解决方案仅用于测试目的,您将获得读取和写入数据库的公共权限。

答案 1 :(得分:20)

这看起来与您的google-services.json有关。

确保应用名称和客户端ID与firebase控制台中的相同。

如果您不确定从项目控制台重新下载google-services.json并将其添加到您的项目中。

答案 2 :(得分:10)

我一直在更改Firestore规则而不是DB ...希望它对像我这样愚蠢的人有所帮助。

enter image description here

答案 3 :(得分:2)

我不完全确定问题是什么,但我刚刚从Firebase删除了我的项目并重新创建了它,删除并安装了新的google-services.json,第二次就完美了。

幸运的是,这是一个测试应用,我的数据库是空的,但如果您处于这种情况并且您的帐户中存储了有价值的信息,我建议您在尝试此解决方案之前将其导出。

答案 4 :(得分:1)

也许您应该将规则设置为: (我有同样的问题。它对我有用。)

// These rules require authentication
    {
      "rules": {
        ".read": "auth != null",
        ".write": "auth != null"
      }
    }

答案 5 :(得分:1)

这个错误的原因也可以在文档中描述的这个东西https://firebase.google.com/docs/database/android/start

<块引用>

注意:要获取对 us-central1 默认 dstabase 以外的数据库的引用,您必须将数据库 URL 传递给 getInstance()(或 Kotlin+KTX database())。对于 us-central1 默认数据库,您可以不带参数调用 getInstance()(或数据库)。 您可以在 Firebase 控制台的实时数据库部分找到您的实时数据库 URL。它将采用 https://.firebaseio.com(对于 us-central1 数据库)或 https://.firebasedatabase.app(对于所有其他位置的数据库)的形式。

答案 6 :(得分:0)

好的,我尝试了所有上述解决方案,但均失败了。 过了一会儿,我发现我的项目有2个模块,我在第二个模块中调用了firebase而不是主模块,因此解决方案是也将第二个模块添加到firebase项目中,并且可以正常工作。