android - 使用公共數據庫的Firebase聊天應用setValue失敗錯誤?




firebase-realtime-database firebase-security-rules (2)

您的代碼正在使用Firebase實時數據庫,但您正在更改Cloud Firestore的安全規則。 雖然兩個數據庫都是Firebase的一部分,但它們完全不同,服務器端的安全規則不適用於另一個。

當您進入Firebase控制台中的數據庫面板時,您很可能最終進入 Cloud Firestore規則

如果您 使用Firebase控制台中 Cloud Firestore規則,則 可以通過單擊頂部的 Cloud Firestore BETA ,然後從列表中選擇 實時數據庫 來更改為實時數據庫規則。

您還可以通過單擊 此鏈接 直接轉到實時數據庫的安全規則。

與您擁有的實時數據庫匹配的安全規則是:

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

這將授予任何經過身份驗證的用戶對整個數據庫的完全讀寫訪問權限。 請閱讀我對此問題的答案,詳細了解此類規則的安全/風險權衡: Firebase電子郵件說我的實時數據庫有不安全的規則

我有一個使用Firebase的聊天應用程序,它繼續使用

x處的setValue失敗: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);
}

改變這一點

request.auth.uid != null

request.auth.uid == null

或者在開始用戶定義的用戶定義的對話之前定義適當的auth機制





firebase-security-rules