2016-07-31 74 views
1

工作何时使用.read与用户节点上的真正的规则火力地堡规则,我给访问一些身份验证的用户阅读上树中列出的每个用户。那我只需要一些。,像一个过滤器

我需要一些规则,就像一个过滤器。因此,在获取用户/路径时,此已认证的用户将获得一个的用户数组,只有的用户拥有像$uid > permission > auth.uid = true这样的权限路径。

{ 
    "rules": { 
    "Users" : { 
     ".read": true, 
     "$uid" : { 
     ".read" : "(auth != null && auth.uid === $uid) || root.child('Users/'+ $uid+'/permission/'+ auth.uid).val() == true", 
     ".write" : false 
     } 
    }, 
    } 
} 
+1

见http://stackoverflow.com/questions/14296625/restricting-child-field-access-with-security-rules –

回答

2

您不能将规则用作过滤器,它们对于您要读取/写入的特定分支是原子的。

你的外读取的规则是给访问整个/Users分支。删除它并获得你想阅读的userId会得到你期望的行为。所以,不幸的是,这只有在与ref.child("Users").child(targetUserId).once...一起阅读时才有效。

{ 
    "rules": { 
    "Users" : { 
     "$uid" : { 
     ".read" : "(auth != null && auth.uid === $uid) || root.child('Users/'+ $uid+'/permission/'+ auth.uid).val() == true", 
     ".write" : false 
     } 
    } 
    } 
} 

如果你想拥有,在一个单一的呼叫,用户ID列表的身份验证的用户可以访问我建议你真正保存访问用户内部/User/userId而不是让那些可以阅读。而你的规则会稍微改变。

{ 
     "rules": { 
     "Users" : { 
      "$uid" : { 
      ".read" : "(auth != null && auth.uid === $uid) || root.child('Users/'+ auth.uid +'/accessibleUsers/'+ $uid).val() == true", 
      ".write" : false 
      } 
     } 
     } 
    } 

此外,缩放,所以当,这取决于你规划你的应用是什么,你应该考虑有这个访问用户在一个单独的分支表(用户外)的这可能会很复杂。

+0

我明白了。我正在写这篇文章(https://www.airpair.com/firebase/posts/structuring-your-firebase-data)说的,所以我遇到了这个问题。我会尝试你的方法。 – calebeaires