安全规则的Firebase通配符路径不起作用?

安全规则的Firebase通配符路径不起作用?,firebase,firebase-security,Firebase,Firebase Security,我正在使用Objective-C API for Firebase获取数据,当我的安全规则(通过Firebase在线仪表板设置)不使用任何通配符路径时,我可以这样做,例如: { "rules": { "user" : { ".read" : true, ".write" : true }, "users" : { ".read" : true, ".write" : false } } } 但是,当我尝试使

我正在使用Objective-C API for Firebase获取数据,当我的安全规则(通过Firebase在线仪表板设置)不使用任何通配符路径时,我可以这样做,例如:

{
  "rules": {
    "user" : {
      ".read" : true,
      ".write" : true
    },
    "users" : {
      ".read" : true,
      ".write" : false
    }
  }
}
但是,当我尝试使用通配符路径和获取对象制定应该相同的安全规则时,完成处理程序从不执行,例如:

{
  "rules": {
    "user" : {
      ".read" : true,
      ".write" : true
    },
    "users" : {
      "$userId" : {
        ".read" : true,
        ".write" : false
      }
    }
  }
}
我在以下URL中使用了Firebase文档,无法找出我做错了什么:

我不认为这个问题是Objective-C特定的,但为了彻底起见,我正在使用方法
-[FQuery observeSingleEventOfType:feventypevalue with block:^(FDataSnapshot*snapshot){}]
来获取数据


更新:以下是我用于调试的特定FQUER的
po查询的输出:

(/users {
    ep = 0;
    i = hidden;
    sp = 0;
})
更新2:这是我的数据结构,以防相关:

{
  "user" : {
    "HhMeloQDY4" : {
      "info" : {
        "name" : "Anita Borg"
      }
    },
    "QxnjCNOj3H" : {
      "info" : {
        "name" : "Charles Babbage"
      }
    },
    "zeNalC4ktf" : {
      "info" : {
        "name" : "Beyoncé"
      }
    }
  },
  "users" : {
    "HhMeloQDY4" : {
      "hidden" : false
    },
    "QxnjCNOj3H" : {
      "hidden" : false
    },
    "zeNalC4ktf" : {
      "hidden" : true
    }
  }
}
更新3:以下是我创建FQQuery对象的Objective-C代码:

Firebase *firebase = [[Firebase alloc] initWithUrl:@"https://<my-app-name>.firebaseio.com"];
[[firebase childByAppendingPath:@".info/connected"] observeEventType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot) {
    BOOL isConnected = [snapshot.value boolValue];
    // broadcast whether app is connected to Firebase
}];
Firebase *directory = [firebase childByAppendingPath:@"users"];
FQuery *query = [directory queryOrderedByChild:@"hidden"];
query = [query queryEqualToValue:value];
[query observeSingleEventOfType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot) {
    // data successfully retrieved from Firebase
}];
Firebase*Firebase=[[Firebase alloc]initWithUrl:@”https://.firebaseio.com"];
[[firebase childByAppendingPath:@.info/connected”]observeEventType:FEventTypeValue with block:^(FDataSnapshot*快照){
BOOL isConnected=[snapshot.value boolValue];
//广播应用程序是否连接到Firebase
}];
Firebase*目录=[Firebase childByAppendingPath:@“用户”];
FQuery*query=[directory queryOrderedByChild:@“隐藏”];
query=[queryqueryqueryqualtovalue:value];
[查询observeSingleEventOfType:FEventTypeValue with block:^(FDataSnapshot*快照){
//已成功从Firebase检索数据
}];

您已在路径
/users/specific\u user\u id/
处添加了读取权限,但您正在尝试在路径
/users/
处读取,该路径不允许读取权限

您需要提供对试图读取的路径的访问,而不仅仅是其子路径的子集。看

编辑:只是添加一些ObjC代码来澄清

有了这个问题

Firebase *directory = [self.myRootRef childByAppendingPath:@"users"];
您直接在用户节点内查询节点。但是,如果您查看该结构,则用户节点中的内容是不可查询的,因为在/users下没有直接的规则,我在/users下对此进行了评论

"users" : {
  //OH NOES! There are no rules here!
  "$userId" : {
     ".read" : true,
     ".write" : false
   }
您的规则位于$userId中,它表示并仅应用于该父级

"$userId" : {
    //these rules *only* apply inside each userId.
    ".read" : true,
    ".write" : false
}
因此,在您的结构中,此查询将起作用,它将仅查询users/HhMeloQDY4中的内容

Firebase *directory = [self.myRootRef childByAppendingPath:@"users/HhMeloQDY4"];
因此,最终的结果是您需要直接在/users节点下分配规则,以允许您查询其子节点中的内容

"users" : {
  ".read" : true,
  ".write" : false
  "$userId" : {
  }

这将允许您读取用户节点($userId及其子节点)下的每个节点,但不向它们写入。

您已在路径
/users/specific\u user\u id/
中添加了读取权限,但您正试图在路径
/users/
中读取,该路径不允许读取权限

您需要提供对试图读取的路径的访问,而不仅仅是其子路径的子集。看

编辑:只是添加一些ObjC代码来澄清

有了这个问题

Firebase *directory = [self.myRootRef childByAppendingPath:@"users"];
您直接在用户节点内查询节点。但是,如果您查看该结构,则用户节点中的内容是不可查询的,因为在/users下没有直接的规则,我在/users下对此进行了评论

"users" : {
  //OH NOES! There are no rules here!
  "$userId" : {
     ".read" : true,
     ".write" : false
   }
您的规则位于$userId中,它表示并仅应用于该父级

"$userId" : {
    //these rules *only* apply inside each userId.
    ".read" : true,
    ".write" : false
}
因此,在您的结构中,此查询将起作用,它将仅查询users/HhMeloQDY4中的内容

Firebase *directory = [self.myRootRef childByAppendingPath:@"users/HhMeloQDY4"];
因此,最终的结果是您需要直接在/users节点下分配规则,以允许您查询其子节点中的内容

"users" : {
  ".read" : true,
  ".write" : false
  "$userId" : {
  }


这将允许您读取用户节点($userId及其子节点)下的每个节点,但不向其写入。

FQuery
指向什么?FQuery是Firebase Objective-C库中的查询类:我知道它是什么类。我想知道它指的是什么,因为这可能会指出读取操作失败的原因。不是100%符合您的要求,但我已从调试器中为用于测试的FQuery实例添加了
po
。FQuery指向什么?FQuery是Firebase Objective-C库中的查询类:我知道它是什么类。我想知道它指向什么,因为这可能会指出读取操作失败的原因。不是100%符合您的要求,但我已从调试器中为我用于测试的FQuery实例添加了
po
。我知道安全规则不是过滤器,但是我对我试图从
/users//
而不是从
/users/
读取的位置感到困惑,我认为在我的两个安全规则中,我都明确允许通过
“.read”:true
进行读取访问。你能详细说明一下吗?我在问题中添加了一个更新,其中包括我的数据结构,以防澄清任何问题。我仍然不清楚我的问题是如何重复的。@KenM.Haggerty您能用实际的ObjC代码更新您的问题吗(请简短些),您正在使用该代码来查询/观察相关节点。加藤的回答是正确的,但查看您的代码(可能是错误的)可能有助于我们让您朝着更好的方向前进,并帮助您理顺规则。@KenM.Haggerty您试图使用Firebase安全规则来过滤数据,这是根本不可能的。要能够查询
/users
,您必须拥有对
/users
的读取权限,这是您的规则所不允许的。@FrankvanPuffelen-Hmm。我想提供对
/users
的完全读取权限,并且我没有试图通过设置
”来使用安全规则进行过滤。read:true
$userId
下,但我一定对通配符路径规则的工作原理有误解。我知道安全规则不是过滤器,但我对我试图从
/users//
而不是
/users/
读取的位置感到困惑,我认为在我的两个安全规则中