我有一个使用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);
}
答案 0 :(得分:8)
您的代码正在使用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。
答案 1 :(得分:0)
更改此
request.auth.uid != null
到
request.auth.uid == null
或在启动由userID定义的用户
的对话之前,定义了适当的身份验证机制