我已将firebase规则设置如下:
{
"rules": {"users": {
"$uid": {
".read": "auth != null",
".write": "$uid === auth.uid"
}}
}
}
允许只写入具有匹配uid的节点并读取每个uid的所有子节点。但我希望它就像我在uid下使用子节点进行查询一样,只有匹配的子节点和它的兄弟节点才能被读取...
例如这是我的json结构:
{
"users" : {
"AJkK4yZJsoseeefrJ7i6KIOUBDghtrhgthrtDi1" : {
"lat" : 20.5001,
"long" : 68.3755,
"number" : "9876543210",
"time" : 1499599788090
}
}
}
我想使用数字进行查询,并将读取规则设置为只能读取数字匹配的纬度和时间。如何写规则?
更新:我的问题是,如何使用数字查询数据库并获取其他兄弟姐妹,如果数字的值在android中匹配?我试过这个但没有工作:}
friend = mDatabase.getReference("users");
friend.keepSynced(true);
Query z = LocationActivity.this.friend.orderByChild("number").equalTo("9876054321");
z.addListenerForSingleValueEvent((new ValueEventListener() {
long lastseen;
public void onDataChange(DataSnapshot dataSnapshot) {
try {
for (DataSnapshot zoneSnapshot: dataSnapshot.getChildren()) {
lastseen = (Long)zoneSnapshot.child("time").getValue();
friendLatitude = (Double) zoneSnapshot.child("lat").getValue();
friendLongitude = (Double) zoneSnapshot.child("long").getValue();
}
} catch (Exception e) {
}}
它返回值null,任何帮助都将不胜感激。
答案 0 :(得分:1)
为了查询每个节点,用户需要具有父级下 ALL 节点的读取权限。
这是因为安全规则不能用于查询Firebase中的数据。
答案 1 :(得分:1)
附加侦听器时会强制执行Firebase读取权限。为了查询节点,您必须具有该节点的读取权限(如Bradley所述)。因此,为了能够查询用户,您必须具有/users
的读取权限。由于任何user that has read permission to /users
can also read any data under that,您无法使用安全规则来过滤用户有权访问的节点。
这称为rules are not filters,是Firebase安全模型新手的常见陷阱之一。我建议您阅读我已经链接的文档以及许多questions/answer about the topic中的一些文档。
针对您的用例的最简单的解决方案似乎是将.read
规则提升为users
:
{
"rules": {
"users": {
".read": "auth != null",
"$uid": {
".write": "$uid === auth.uid"
}
}
}
}
}
答案 2 :(得分:0)
不确定是否能回答问题,但是我发现这篇文章正在寻找有关Firebase Storage的以下解决方案..我可以在其中控制可访问哪些同级节点:
match /uploadRoot/{userId}/{uploadCategory}/{allPaths=**} {
// allow read access for client upload/download
allow read, write:
if request.auth != null
&& request.auth.uid == userId
&& (
uploadCategory == 'userTextFiles'
|| uploadCategory == 'userImages'
);