2016-11-29 366 views
0

最近I asked a question about Firebase permissions变量:这是一个规则JSON树:

{ 
    "rules": { 
    "Leaders":{ 
     "$leaderuid": { 
     ".write": "$leaderuid == auth.uid", 
     "DATA": { 
      ".write": "data.parent().child('ALLOWED').child(auth.uid).exists()" 
     } 
     } 
    } 
    } 
} 

实际的数据库

{ 
    "Leaders" : { 
    "A" : { 
     "ALLOWED" : { 
     "b" : 0, 
     "c" : 0, 
     "d" : 0 
     }, 
     "DATA" : { 
     "blah blah1" : "content writable by bcd", 
     "blah blah2" : "content writable by bcd" 
     }, 
     "REQUESTS" : { 
     "E" : 0 
     } 
    } 
    } 
} 

我只是想帮助理解什么$leaderuid手段。我阅读过文档,这是一个临时变量。

我有一个想法,请纠正我或告诉我,我在想什么是准确的。

创建的临时变量$leaderuid是创建的领导者的authUID?

+0

它只是您的动态密钥的领导者节点 –

回答

2

$变量拥有节点所拥有的任何关键字。所以,如果你有以下结构:

{ 
    "Leaders" : { 
    "A" : { 
     ... 
    }, 
    "B": { 
     ... 
    } 
    } 
} 

当你的安全规则A下进行评估,然后$leaderuidA。但是当规则在B下评估时,则$leaderuid将为B

$变量的名称不重要。但是由于您似乎在保留领导者名单,并且您说您将他们存储在他们的UID下,所以我在之前的答案中将变量名称命名为$leaderuid

这包括在Firebase documentation on structuring data for securing user access。花费几个小时在那里和其他文档中,应该回答很多您可能遇到的问题。

+0

谢谢!我更明白这一点。一个问题,但。 Firebase将如何检查第一个是UID还是第二个或第三个....?从本质上讲,$变量创建递归,它检查所有的$ leaderuids并检查当前的id是否匹配其中的任何一个? – DilllyBar

+0

规则总是在JSON树中实际节点的上下文中进行评估。当您在规则中使用变量时(例如'$ leaderuid == auth.uid'),服务器将从该上下文节点向上搜索,直到找到声明变量的位置并使用该密钥。但说实话,在数据库控制台中使用规则模拟器开始播放时,这很难解释并且更容易使用。 –