2017-03-03 58 views
0

这里是我的火力结构:火力地堡规则不正常工作

-posts 
-public 
    -countryCode 
    -US 
    -KeJ9qrPZYWD-b0AdQ3I 
    -timestamp:1488544558698 
    -postAuthor:TT4l2xyIOFRXI3RZINffcSFs67O2 
    -KeAVVwWQ-OuwyMRycI4 
    -timestamp:1488544595373 
    -postAuthor:TT4l2xyIOFRXI3RZINffcSFs67O2 
-users 
-TT4l2xyIOFRXI3RZINffcSFs67O2 

而且我想允许用户阅读从过去24小时或帖子,如果用户是帖子的作者则没有限制,所以我做了我的火力点像这样的规则:

{ 
    "rules": { 
    "users": { 
     "$uid": { 
     ".read": "$uid === auth.uid", 
     ".write": "$uid === auth.uid" 
     } 
    }, 
    "posts":{ 
     ".write" : "auth != null", 
     "public":{ 
     "countryCode":{ 
     "$countryCode_id":{ 
      "$post" :{ 
      ".read" : data.child('postAuthor').val() === auth.uid || data.child('timestamp').val() > (now - 86400000) 
      } 
     } 
    } 
} 
} 
    } 
} 

,但它不工作,我可以编写一个新的,但不能读取任何东西,即使职位在指定的时间或由目前的作者提出,有什么不对?

编辑: 好的,所以我发现规则的规则:“规则不是过滤器”,它破坏我的想法一点点,因为我需要阅读访问我的帖子的父母,但如果我会标记为已读我的帖子将被读取无论作者或时间将会是级联的原因 - 非常令人沮丧:(所以现在我需要弄清楚如何做到这一点。我的第一个想法是创建另一条路径所有帖子,并从那里获取所有帖子,其中所有帖子都将被标记为read:true,然后使用observesingleevent(.value)获取每个帖子的关键字,并直接观察当前帖子在另一个分支上,我可以设置我的读写权限,我是否想好?

+0

从编辑部分它听起来你需要阅读关于[数据结构化和非规范化]的文档(https://firebase.google.com/docs/database/ios/structure-data#best_practices_for_data_structure) –

回答

0

没有看到代码给出的问题,它是很难确定。但很有可能你试图从你没有阅读权限的级别阅读。例如: -

ref = FIRDatabase.database().reference("/posts/public/countryCode/US") 
query = ref.queryOrdered(byChild: "postAuthor").queryEqual(toValue: "TT4l2xyIOFRXI3RZINffcSFs67O2") 
query.observeEventType(.Value, withBlock: { snapshot in 
    ... 

此查询将失败,因为用户没有对/posts/public/countryCode/US读取权限。与您可能认为的相反,Firebase查询不能用于过滤数据。这在火力地堡背景下,称为“规则并不滤镜”我建议查看:

+0

是的,我已经知道了,我编辑了我的后,你可以采取一个厕所k如果我在那里? –