我想在firebase中的Items
节点上保存一些数据。当我的规则
"Items":{
".write": "auth != null",
".read": "auth != null"
}
但我希望用户能够编写/更新拥有项目,我不希望使用$
变量,因为它会在我的网站上添加一些数据路径。
以下方法会在我的路径上添加一些数据而不是/Items
它将是/key/Items
{
"rules": {
"Items": {
"$user_id": {
".read": "auth != null",
".write": "$user_id === auth.uid"
}
}
}
}
因此,我看到的最好的方法是像这样编写我的规则
"Items":{
".read": "auth != null",
".write": "(data.exists() && data.child('userId').val() === auth.uid) || (!data.exists() && newData.child('userId').val() === auth.uid)"
}
}
当我在模拟器上运行以下代码时,一切正常
{
"userId":"xxxxxxxxxxxxxxxxx"
}
但是我尝试从手机上传数据,我收到错误
setValue at /Items/-KWH6tgdLPGTdascf-w3 failed: DatabaseError: Permission denied
我哪里错了?
答案 0 :(得分:0)
一种更简单的方法是在允许用户更新并将对象推送到Firebase之前,仅检查登录用户的ID是否与userId
变量存储的ID相同。
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
Item item;
if (user != null) {
//logged in
String uid = user.getUid();
if(uid.equals(item.getUserId()){
//allow the user to update item.
}
} else {
//not logged in
}
答案 1 :(得分:-1)
将数据库读写规则设置为true
"Items":{
".write": "true",
".read": "true"
}
答案 2 :(得分:-2)
根据实时日期数据库的最新版本,请执行以下操作: https://firebase.google.com/docs/firestore/security/get-started?authuser=0
在数据库的ur标签规则中添加此代码:
// Allow read/write access to all users under any conditions
// Warning: **NEVER** use this rule set in production; it allows
// anyone to overwrite your entire database.
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}