W / SyncTree:收听/产品失败:DatabaseError:权限被拒绝?

时间:2017-09-07 19:00:01

标签: android firebase firebase-realtime-database

我正在使用android studio开发一个基本的交付应用程序,我使用Firebase作为数据库。我需要保存用户信息以及所有用户可以选择的产品。 因此,基本上每个用户只能访问他们的详细信息,但每个用户都可以访问所有产品的详细信息。 以下是我对数据库的规则:

    {
"rules": {
"users": {
  "$uid": {
    ".read": "auth != null",
    ".write": "auth != null"
      }
  },"Products": {
"$uid": {
    ".read": true,
    ".write": true
  }
 }
}
}

数据库结构:

    pat-2017-42536
     Products
       1
         Description: "Product description"
         Name: "Name of product"
         Price: "Price of product"
       2
         Description: "Product description"
         Name: "Name of product"
         Price: "Price of product"
       etc...

我尝试将权限更改为true,因为之前的一些问题建议但仍然一直给我这个错误:

     W/SyncTree: Listen at /Products failed: DatabaseError: Permission denied

这是我在Andoid Studio中的onCreate:

    databaseProducts = FirebaseDatabase.getInstance().getReference("Products");
    databaseProducts.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            showData(dataSnapshot);
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

以下是应该获取产品详细信息的方法:

    private void showData(DataSnapshot dataSnapshot) {
    for(DataSnapshot productSnapShot: dataSnapshot.getChildren()){

        Product product = productSnapShot.getValue(Product.class);
        product.setName(productSnapShot.child("item").getValue(Product.class).getName());
        product.setDescription(productSnapShot.child("item").getValue(Product.class).getDescription());
        product.setPrice(productSnapShot.child("item").getValue(Product.class).getPrice());

        ArrayList<String> array = new ArrayList<>();
        array.add(product.getName());
        array.add(product.getDescription());
        array.add("R" + product.getPrice() + ".00");

        Log.d(TAG,"showData: name " + product.getName());
        Log.d(TAG,"showData: description " + product.getDescription());
        Log.d(TAG,"showData: price " + product.getPrice());

        ArrayAdapter adapter = new ArrayAdapter(CustomerActivity.this,android.R.layout.simple_expandable_list_item_1,array);
        listViewProducts.setAdapter(adapter);

    }
}

这可能是一个简单的错误,但我似乎无法找到它。有什么帮助吗?

3 个答案:

答案 0 :(得分:0)

问题是,当您允许在/Products阅读时,您尝试阅读/Products/Something。启用Products节点读取。

您的规则应该是

{
    "rules": {
                   "users": {
                                    "$uid": {
                                                 ".read": "auth != null",
                                                 ".write": "auth != null"
                                   }
                    },
                   "Products": {
                                         ".read": true,
                                         ".write": true
                  }
       }
}

答案 1 :(得分:0)

我不认为Birendra提供的上述答案会做你想要的。我相信这将允许任何经过身份验证的用户在任何其他特定用户ID中进行读写。这与默认规则相同,但仅限于用户ID。他说你已经设置了这样的事实是正确的,所以它正在寻找/ Products / $ uid所以如果你想要任何人(无论是否经过身份验证)都要阅读并且写入您的产品列表然后这将是规则 - 但我无法想象您希望您的产品列表可由每个人修改。据我所知,您希望用户能够阅读和编写自己的帐户信息,但每个人都可以访问这些产品。我不确定您是否只希望经过身份验证的用户能够查看产品,因此我将包含两者的规则。请记住,对于特定节点,您的读写规则不必相同。因此,如果您希望每个经过身份验证的用户都能够看到其他用户的信息,但只有该特定用户可以写入他们自己的个人资料,并且您希望您的“产品”能够被公众查看(不需要身份验证) ,但你显然不希望公众搞乱你的产品,你可以有这样的规则:

{
    "rules": {
                   "users": {
                              ".read": "auth != null", //all authenticated users can read the information from the "users" node.
                                    "$uid": {
                                             ".write": "$uid === auth.uid" //only a user with an authenticated uid that matches the uid of the child node will be able to write to their node--no need for a read rules because it is already covered in the parent node
                                   }
                    },
                   "Products": {
                                         ".read": true,
                                         ".write": false //you don't want just anybody to write to this node--probably even better since this wouldn't allow anyone to modify the products is to set it up with an admin access where a specific uid is the only one that has access--such as ".write": "auth.uid === 'dJrGShfgfd2'"
                  }
       }
}

如果您只希望经过身份验证的用户能够阅读产品,但无法修改产品,那么您需要:

{
    "rules": {
                   "users": {
                              ".read": "auth != null",
                                    "$uid": {
                                             ".write": "$uid === auth.uid"
                                   }
                    },
                   "Products": {
                                         ".read": "auth != null",
                                         ".write": false
                  }
       }
}

最后,如果经过身份验证的用户可以添加或修改产品,那么您需要:

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

答案 2 :(得分:0)

使规则如下所示 确保您选择了REALTIMEDATABASE。

 {
 security rules. */
  "rules": {
    ".read": true,
    ".write": true
  }
}

将有两个数据库 1)云消防站 2)实时数据库 选择实时数据库并按照上述规则更改规则。

以上规则使其对所有人可见。