好了,所以我會假設你的數據的結構類似下面。這個答案是我自己的主觀方法,我將如何動態管理訪問數據庫不同部分的用戶。
注意 ::我使用的chmod代表READ-WRITE-DELETE,而不是READ-WRITE-EXECUTE(即6 =讀取+寫入但不是刪除,7 =完全CRUD特權)。此示例數據庫分爲三部分,並模擬社交媒體應用程序。 。此外,對於「世界」(第3位的默認很可能將只有經過身份驗證的用戶這是一個很簡單的例子:
root/
|
|-- user/ <-main node that contains profile info
| \uid <-node name - one for each user with sub-nodes containing profile info
| \user
| |-<UID> <-shows who has "user" privileges (1st digit)
| \group
| |-<UID> <-shows who has "group" privileges (1st digit)
| \permissions = 744 <-universal "user" entry rule
|
|-- trending/ <-node that contains global, read only info
| \user <-No one will be here for "trending"
| \group
| \feed-data
| \<POST_UUIDS> <-Data here
| \permissions = 444 <-Everyone can read the global feed
|
|-- messaging/
| \<chat-uuid-number-1>
| \user
| |-<User1>
| |-<User2>
| \group
| \messages node
| \<chat-uuid-number-2>
| \user
| |-<User8>
| |-<User5>
| \messages-node
|
| \permissions = 600 <-Only 2 users can read&send messages in their node
|
|-- chatrooms/ <-each node contains a list of UID, and list of messages
| \<room-uuid-number>
| \user
| |-<Admin1>
| |-<Admin2...>
| \group
| |-<uid1>
| |-<uid2>
| |-<uid3...infinity>
| \permissions = 760 <-Only admins have user privilege, users in chat can send and receive in the chat though
所以這是一個有點denormalized
數據庫結構,如JSON數據庫顯然應該在這裏閱讀:https://firebase.googleblog.com/2013/04/denormalizing-your-data-is-normal.html每個分支除了它所關心的東西外,並不包含非常多的信息現在,如果你有統一的「繼承」類型結構,那麼你可以使用相對目錄路徑來檢查相對於目錄用戶試圖訪問並隔離驗證規則的一個位置 - 然後所有的子節點都將被覆蓋,只要它們具有統一的基本權限結構!
所以只要你的新數據永遠不會進入根目錄或其下的任何主節點/目錄(你可以編寫規則來確保這一點),你可以使用data.parent()來獲得你的條目的父母,然後再次調用parent()以進入主目錄(例如,聊天室),那麼你檢查每個連續的數字對用戶/組/世界列表的權限值,並匹配:
".write": "data.parent().parent().child('permissions').val().beginsWith('6') && data.parent().child('users').child($uid).exists"
這(僞)檢查的權限代碼的第一個數字,然後檢查節點的「用戶」子目錄查看當前用戶是否具有該特定子節點的用戶權限。在此之後添加一個條件OR來檢查是否存在group
寫入權限並且用戶存在於組中。等等...所有從根目錄!只要確保你防止在'/'或'//'下寫入(首先使用'& &'寫入這些條件,以便在嘗試獲取根父級之前檢查失敗,等等),並且它應該可以正常工作。
這不是一個絕對的結構,但我把我的數據庫設置爲'淺'數據庫,同時限制每個條目像「消息」這樣的主目錄下有一個權限代碼並檢查用戶的UID數據庫讀/寫,它爲我節省了大量的痛苦。雖然我上次使用它的時間大約是5個月前,但我不確定事情是否現在變得更簡單或者簡單的工具/庫。希望這有助於!
也許嘗試做每個用戶的Linux chmod樣式字段和創建權限的方式?這樣,您只有一個字段,並在權限中定義所有組合。 –
爲了準確,Bolt是一個實驗性的安全性和規則編譯器,並且處於Beta版。 – Mario
Hi @PrestonGarno。是的,這是有效的。恢復角色是可能的,但符合代表角色的條件是我沒有意識到如何去做的部分。你可以恢復說777或765等角色,但是你不能根據這個改變firebase的.write規則。 – Mario