Firebase 聊天应用 setValue 在公共数据库中失败?

Posted

技术标签:

【中文标题】Firebase 聊天应用 setValue 在公共数据库中失败?【英文标题】:Firebase chat app setValue failed error with a public database? 【发布时间】:2019-02-07 03:38:00 【问题描述】:

我有一个使用 Firebase 的聊天应用,它一直在使用

setValue at x 失败:DatabaseError: 权限被拒绝

每次输入信息都会出错。

我已经将我的数据库设置为公开:

service cloud.firestore 
  match /databases/database/documents 
    match /allPaths=** 
      allow read, write: if request.auth.uid != null;
    
  

这是我的聊天参考中的内容吗?

private void displayChat() 

    ListView listOfMessage = findViewById(R.id.list_of_message);

    Query query = FirebaseDatabase.getInstance().getReference();
    FirebaseListOptions<Chat> options = new FirebaseListOptions.Builder<Chat>()
            .setLayout(R.layout.list_item)
            .setQuery(query, Chat.class)
            .build();

    adapter = new FirebaseListAdapter<Chat>(options) 
        @Override
        protected void populateView(View v, Chat model, int position) 
            //Get reference to the views of list_item.xml
            TextView messageText, messageUser, messageTime;
            messageText = v.findViewById(R.id.message_text);
            messageUser = v.findViewById(R.id.message_user);
            messageTime = v.findViewById(R.id.message_time);

            messageText.setText(model.getMessageText());
            messageUser.setText(model.getMessageUser());
            messageTime.setText(DateFormat.format("dd-MM-yyyy (HH:mm:ss)", model.getMessageTime()));
        
    ;
    listOfMessage.setAdapter(adapter);

【问题讨论】:

***.com/questions/52092843/… 【参考方案1】:

您的代码正在使用 Firebase 实时数据库,但您正在更改 Cloud Firestore 的安全规则。虽然这两个数据库都是 Firebase 的一部分,但它们完全不同,一个的服务器端安全规则不适用于另一个。

当您进入 Firebase 控制台中的数据库面板时,您很可能会看到 Cloud Firestore rules:

如果您使用的是Cloud Firestore rules in the Firebase console,则可以通过单击顶部的 Cloud Firestore BETA,然后从列表。

您也可以通过点击this link直接进入实时数据库的安全规则。

与您所拥有的实时数据库相匹配的安全规则是:


  "rules": 
    ".read": "auth.uid !== null",
    ".write": "auth.uid !== null"
  

这将授予任何经过身份验证的用户对整个数据库的完全读写访问权限。阅读我对这个问题的回答,了解更多关于此类规则的安全/风险权衡:Firebase email saying my realtime database has insecure rules。

【讨论】:

【参考方案2】:

改变这个

request.auth.uid != null

request.auth.uid == null

或在开始对话之前定义适当的身份验证机制,其中用户由 userID 定义

【讨论】:

以上是关于Firebase 聊天应用 setValue 在公共数据库中失败?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以从 Firebase 同步加载数据?

在 Swift 3 中将数据添加到 Firebase 而不是 SetValue

如何修复“java.lang.NoSuchMethodError:com.google.firebase.database.DatabaseReference.setValue”

Firebase 数据库中的 setValue() 方法不起作用。值未添加到数据库中

Firebase 实时数据库 setValue() 不工作

Firebase 网络应用聊天重复聊天输入