2016-09-06 29 views
2

我有這樣的結構:火力地堡:允許管理員和特定記錄用戶閱讀收集

{ "users": { 
    { 
    "uid1" : { 
     "admin" : true, 
     "email" : "[email protected]", 
     "name" : "Admin User" 
    }, 
    "uid2" : { 
     "email" : "[email protected]", 
     "name" : "User 1" 
    }, 
    "uid3" : { 
     "email" : "[email protected]", 
     "name" : "User 2" 
    } 
    } 
} 

我有以下的規則,允許管理員或用戶自己來讀取一個用戶的數據和按預期工作:

{ 
    "users": { 
    ".read": true, 

    "$uid": { 
     // data is the user's or user is admin 
     ".read": "root.child('users').child(auth.uid).child('admin').val() == true || auth.uid == $uid", 
    } 
    } 
} 

什麼我需要做的,除了什麼規則已經允許,有管理員的用戶能夠列出集合中的所有用戶?

回答

4

有了Firebase,一旦您授予了權限,您就無法在樹的下方撤銷它。因此,".read": trueusers下授予所有用戶的讀取權限。

您需要更改users下的規則,以便其僅對管理員使用true。這樣做,還允許管理員列表中的用戶(也應該看到其他規則影響你所期望的行爲):

{ 
    "users": { 
    ".read": "root.child('users').child(auth.uid).child('admin').val() === true", 
    "$uid": { 
     ".read": "root.child('users').child(auth.uid).child('admin').val() === true || auth.uid === $uid", 
    } 
    } 
} 

這可以簡化 - 如在評論中提到 - 因爲在users級聯規則下來,不需要重複:

{ 
    "users": { 
    ".read": "root.child('users').child(auth.uid).child('admin').val() === true", 
    "$uid": { 
     ".read": "auth.uid === $uid" 
    } 
    } 
} 
+2

由於管理員的讀取權限已經級聯,因此您不需要重複'$ uid'下的管理員權限。該規則可以是「.read」:「auth.uid === $ uid」' –

+0

好!看起來我誤解了文檔。工作正常,謝謝! –