2017-03-16 120 views
2

我的火力地堡数据结构看起来像复杂火力地堡安全规则

-isAdmin 
    -user1 
     isAdmin: true 

-users 
    -user1 
     -firsName: Jane 
     -lastLoggedIn: 12 March 2017 
    -user2 
     -firstName: John 
     -lastLoggedIn: 11 March 2017 

我想我的管理员(用户1)能够做到以下

添加更多的用户-Users分支。所以,我需要以下权限(创建用户3,USER4 ...等)

"users": { 
    .write: "(auth != null) && (root.child('isAdmin').child(auth.id).val == true) 
} 

不过我也希望非管理员用户能够以更新lastLoggedIn条目。所以,我需要以下权限

"users": { 
    $userId: { 
     "lastLoggedIn": { 
      .write: "(auth != null) && ($userId == auth.id) 
     } 
    } 
} 

这里的问题是,虽然,火力不允许嵌套的规则,因为我有在用户.WRITE规则,可根据用户的.WRITE规则/ $用户名/ lastLoggedIn将被忽略我相信

有没有办法解决这个问题?

回答

2

Firebase安全规则不允许嵌套规则 - 它们的确如此。规则级联以及您需要注意的情况是,一旦授予了权限,就不能通过“嵌套”规则撤消该权限。

因此,只有在更高的规则已经授予写入权限的情况下,'嵌套'规则才会被忽略。如果写入权限尚未被授予,并且“嵌套”规则授予写入权限,则不会被忽略。

这些规则:

"users": { 
    ".write": "(auth != null) && (root.child('isAdmin').child(auth.uid).val == true), 
    "$userId": { 
    "lastLoggedIn": { 
     ".write": "(auth != null) && ($userId == auth.uid) 
    } 
    } 
} 

管理员和自己就能写lastLoggedIn用户。

+0

感谢您的及时答复。我已经在Firebase模拟器中验证了结果,并确认这是正确的。 – ErnieKev