安全规则的Firebase通配符路径不起作用?
我正在使用Objective-C API for Firebase获取数据,当我的安全规则(通过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 } } } 但是,当我尝试使
{
"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/
读取的位置感到困惑,我认为在我的两个安全规则中