2017-03-07 45 views
0

在iOS的消息傳遞應用程序,我創建,結構的信息節點的概要如下我怎麼能指孩子通配符變量火力地堡

"messages": { 
     "$uid":{ 
      ".read": "auth.uid == $uid", 
      "$messageId":{ 

       // insert .write rule here 

       "toUid":{ 
        // if its a group message then there would be multiple "$toUid" children 
        "$toUid":{ 

        }, 
       }, 
       "fromUid":{ 
        "$fromUid":{ 

        } 
       }, 
       "timeStamp":{ 

       }, 
       "group":{ 
        "isGroupMessage":{ 

        }, 
        "groupId":{ 

        } 
       } 
      } 
     } 
    }, 

我想補充一個寫入規則在$ messageId之後,以確保「$ toUid」或「$ fromUid」等於$ uid。

任何想法我可以做到這一點?

是下面這樣做的最佳方式:

".write": "newData.child('toUid').hasChild($uid) || newData.child('fromUid').hasChild($uid)", 

**我已經與下面的解決方案 - 改變結構,但是是最快/最安全的安全規則,我們用現在。

MVP最初不會有組消息(可能不相關,但邏輯可能不同) - 所以或者我可以添加一個wildCard子變量「$ friendUid」,然後在下面有下面的規則。

"$messageId":{ 
    "$friendUid":{ 
    ".write": "$uid == auth.uid || $friendUid == auth.uid", 
+1

你不能在如果列表包含特定值的安全檢查。您只能檢查是否存在特定的密鑰。所以你的第一個'.write'片段確實是正確的方法。你有問題嗎? –

+1

@FrankvanPuffelen認爲我已經明白了,謝謝。我將添加一個帶有「$ friendUid」通配符變量的額外圖層,這似乎是我們前進的最簡單/最安全的方式。問題更多地考慮了更進一步的功能,這與沒有用戶無關:)(還沒有發佈) – Edward

+1

聽起來不錯愛德華。你可以發佈你的解決方案作爲答案? Stack Overflow鼓勵自我回答,這是建立聲譽的好方法。 –

回答

1

所以這就是我決定爲我的消息節點構建Firebase數據庫規則的方式。我添加了一個帶有通配符變量「$ friendUid」的額外子節點,以便輕鬆引用它並鎖定我的消息分支。

"messages": { 
     "$uid":{ 
      ".read": "auth.uid == $uid", 
      "$messageId":{ 
       "$friendUid":{ 
        ".write": "$uid == auth.uid || $friendUid == auth.uid", 
        ".validate": "root.child('friends/'+$uid+'/'+$friendUid).exists()", 

        "toUid":{ 
         "$toUid":{ 
          ".validate": "$toUid == $friendUid || $toUid == $uid" 
         }, 
        }, 
        "fromUid":{ 
         "$fromUid":{ 
          ".validate": "$fromUid == $friendUid || $fromUid == $uid" 
         }, 
        }, 
        "timeStamp":{ 
         ".validate":"newData.isNumber()" 
        }, 
        "$other":{ 
         ".validate": false 
        } 
       } 
      } 
     } 
    },