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的主要内容,如果未能解决你的问题,请参考以下文章