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

Posted

技术标签:

【中文标题】Firebase 数据库权限被拒绝,读/写权限设置为 true【英文标题】:Firebase Database Permission denied with read/write permissions set to true 【发布时间】:2016-09-22 07:33:02 【问题描述】:

我在简单的 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"

【问题讨论】:

嗯...规则看起来不错,所以听起来确实很奇怪。你确定你保存/发布了规则吗? 我点击了发布按钮并成功尝试了模拟器,据我所知它已经发布了! 很奇怪。有几件事要检查:首先,您能否检查您的 google-services.json 并确保您使用的项目是您期望的项目。其次,您可以尝试从项目中删除身份验证(如果存在,请注释掉 firebase-auth 的 gradle 依赖项),看看是否有什么不同? 在我的情况下注释掉 firebase-auth 不起作用,但我认为这是因为我的 google-services.json 有问题。我在设置时出错,所以我在 Firebase 上重新创建了整个项目,最后一切正常。非常感谢! 附带说明,您最好实例化您的数据库并在 Message 类之外获取对它的引用。 【参考方案1】:

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

【讨论】:

请以文本形式包含代码。而且你似乎在说 OP 愚蠢?! 没有要包含的代码。不是说OP愚蠢,而是那些和我犯同样错误的人。我相信他们可以克服被称为愚蠢的问题。 是的,兄弟,就是这样,但这不是你的问题,我们都习惯默认设置实时数据库。 这是我的问题。谢谢。 搞笑错误:/【参考方案2】:

完整解决方案:

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;

注意此解决方案仅用于测试目的,您按照以下步骤授予公共权限以读取和写入您的数据库。

【讨论】:

它对我不起作用...当我在第二步中提到的数据库中添加规则时,firebase 给了我错误,它无法识别 ruels 和后续代码...在哪里准确放置这个第二步中的代码... 如果您对此答案感到困惑,请确保在单击数据库侧边栏选项后,选择实时数据库并更改该数据库的规则,而不是默认的“Cloud Firestore”。 Take a look at Zogrof's answer 第 1 步应该没问题,并将 firebase-auth 添加到您的项目实施中implementation 'com.google.firebase:firebase-auth:18.1.0'【参考方案3】:

您的 google-services.json 似乎有问题。

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

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

【讨论】:

像梦一样工作。 如果 react native 发生这种情况呢? 嘿devprashant,我也得到了这个错误,试图在当前用户ID旁边的数据库中添加一个空字符串,但我的google-services.json是正确的并且数据库是公共的 google-services.json的位置应该在./android/app文件夹,而不是./android【参考方案4】:

我不完全确定问题出在哪里,但我刚刚从 Firebase 中删除了我的项目并重新创建了它,删除并安装了新的 google-services.json,它第二次运行良好。

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

这个错误的原因也可能在文档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(对于所有其他位置的数据库)。

【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于Firebase 数据库权限被拒绝,读/写权限设置为 true的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 实时数据库的权限被拒绝

Firebase 数据库权限被自定义令牌拒绝

Firebase 权限被拒绝错误

Firebase 规则 - 权限被拒绝

Firebase权限被拒绝Swift 3

Firebase实时数据库:DatabaseError权限被拒绝