2017-03-16 147 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