Firebase 数据库权限被拒绝,read/write 权限设置为 true
Firebase Database Permission denied with read/write permissions set to true
我在简单的 Android 应用程序中写入 Firebase 数据库时遇到问题。我已将我的数据库规则设置为 public:
{
"rules": {
".read": true,
".write": true
}
}
创建了一个简单的 class 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"
我不完全确定问题出在哪里,但我刚刚从 Firebase 中删除了我的项目并重新创建了它,删除并安装了新的 google-services.json 并且它在第二次运行时运行良好时间.
幸运的是,这是一个测试应用程序,我的数据库是空的,但如果您处于这种情况并且您的帐户中存储了有价值的信息,我建议在尝试此解决方案之前将其导出。
您的 google-services.json 似乎有问题。
确保应用名称和客户端 ID 与 firebase 控制台中的相同。
如果您不确定,请从您的项目控制台重新下载 google-services.json 并将其添加到您的项目中。
完整的解决方案:
1).首先转到“身份验证”选项卡,然后 select 登录方法 打开匿名
2).其次转到数据库选项卡并编写规则
{
"rules": {
".read": true,
".write": true
}}
3).第三,转到存储选项卡并写入以下规则
service firebase.storage {
match /b/myapplicationname-f2266.appspot.com/o {
match /{allPaths=**} {
allow read, write;
}}}
注意 此解决方案仅用于测试目的,您将按照以下步骤授予 public 读取和写入数据库的权限。
我一直在更改 firestore 规则而不是 DB...希望它对像我这样愚蠢的人有所帮助。
好的,我已经尝试了以上所有解决方案,但都失败了。
过了一会儿,我发现我的项目有 2 个模块,我在第二个模块而不是主模块中调用 firebase,所以解决方案是将第二个模块也添加到 firebase 项目中,并且它有效。
也许您应该将规则设置为:
(我遇到了同样的问题。它对我有用。)
// These rules require authentication
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
这个错误的原因也可以在文档中描述的这个东西https://firebase.google.com/docs/database/android/start
Note: To get a reference to a database other than a us-central1 default dstabase, you must pass the database URL to getInstance() (or Kotlin+KTX database()) . For a us-central1 default database, you can call getInstance() (or database) without arguments.
You can find your Realtime Database URL in the Realtime Database section of the Firebase console. It will have the form https://.firebaseio.com (for us-central1 databases) or https://.firebasedatabase.app (for databases in all other locations).
我在简单的 Android 应用程序中写入 Firebase 数据库时遇到问题。我已将我的数据库规则设置为 public:
{
"rules": {
".read": true,
".write": true
}
}
创建了一个简单的 class 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"
我不完全确定问题出在哪里,但我刚刚从 Firebase 中删除了我的项目并重新创建了它,删除并安装了新的 google-services.json 并且它在第二次运行时运行良好时间.
幸运的是,这是一个测试应用程序,我的数据库是空的,但如果您处于这种情况并且您的帐户中存储了有价值的信息,我建议在尝试此解决方案之前将其导出。
您的 google-services.json 似乎有问题。
确保应用名称和客户端 ID 与 firebase 控制台中的相同。
如果您不确定,请从您的项目控制台重新下载 google-services.json 并将其添加到您的项目中。
完整的解决方案:
1).首先转到“身份验证”选项卡,然后 select 登录方法 打开匿名
2).其次转到数据库选项卡并编写规则
{
"rules": {
".read": true,
".write": true
}}
3).第三,转到存储选项卡并写入以下规则
service firebase.storage {
match /b/myapplicationname-f2266.appspot.com/o {
match /{allPaths=**} {
allow read, write;
}}}
注意 此解决方案仅用于测试目的,您将按照以下步骤授予 public 读取和写入数据库的权限。
我一直在更改 firestore 规则而不是 DB...希望它对像我这样愚蠢的人有所帮助。
好的,我已经尝试了以上所有解决方案,但都失败了。 过了一会儿,我发现我的项目有 2 个模块,我在第二个模块而不是主模块中调用 firebase,所以解决方案是将第二个模块也添加到 firebase 项目中,并且它有效。
也许您应该将规则设置为: (我遇到了同样的问题。它对我有用。)
// These rules require authentication
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
这个错误的原因也可以在文档中描述的这个东西https://firebase.google.com/docs/database/android/start
Note: To get a reference to a database other than a us-central1 default dstabase, you must pass the database URL to getInstance() (or Kotlin+KTX database()) . For a us-central1 default database, you can call getInstance() (or database) without arguments. You can find your Realtime Database URL in the Realtime Database section of the Firebase console. It will have the form https://.firebaseio.com (for us-central1 databases) or https://.firebasedatabase.app (for databases in all other locations).