我正在使用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);
}
}
这可能是一个简单的错误,但我似乎无法找到它。有什么帮助吗?
答案 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)实时数据库 选择实时数据库并按照上述规则更改规则。
以上规则使其对所有人可见。