2017-05-11 126 views
2

我有一個問題,爲了我自己的理智。下面是我的火力規則多重Inhertitance Firebase安全規則

{ 
    "rules": { 
     ".read": "auth != null", 
     ".write" : false, 
     "users": { 
      "$uid": { 
       ".read": "auth != null && auth.uid == $uid", 
       ".write": "auth != null && auth.uid == $uid", 
       "tokens": { 
        ".write": "(newData.val() < data.val())" 
       } 
      } 
     }, 
     ... 

一部分如果我理解正確的規則規定:

  • 所有用戶都必須以讀取任何節點
  • 所有的用戶不能被auth'ed寫入任何節點
  • 用戶特定的節點:
  • 爲了從您自己的數據讀取,你需要auth'ed,你只能讀取自己的節點
  • 爲了寫自己的用戶數據,您必須auth'ed,你只能寫自己的節點
  • 用戶/令牌節點只能遞減,並且永遠不會增加任何用戶

有人可以確認我的假設/理解,閱讀Firebase安全規則文檔。

也沒有人有任何好的文章或有用的提示使用模擬器!?

回答

0

安全規則的一個重要概念是讀/寫規則在樹中「級聯」。這在the documentation中簡要討論。這意味着,當您從上到下閱讀規則時,授予訪問權限的第一條規則優先於位於該位置子項下的任何規則。

解決您的每個項目:

  • 所有用戶都必須以讀取任何節點(
  • 的所有用戶無法寫入任何節點(非權威性被auth'ed 「編用戶無法寫入任何節點
  • 用戶特定的節點:
  • 爲了從您自己的數據讀取,你需要auth'ed,你只能讀取自己的節點(YES
  • 爲了寫自己的用戶數據,您必須auth'ed,你只能寫自己的節點(
  • 用戶/令牌節點只能遞減和從來沒有增加任何用戶(見下文

在當前的規則,對於較小的令牌檢查是不是有效,因爲授予的auth'ed用戶寫訪問的優先規則覆蓋它。您還需要解決沒有現有令牌值的情況。我的修復建議是使用.validate規則。該documentation建議:

使用一次.WRITE規則授予訪問權限,以確保數據 被寫入符合一個特定的模式。

{ 
    "rules": { 
    ".read": "auth != null", 
    ".write": false, 
    "users": { 
     "$uid": { 
     ".read": "auth.uid == $uid", 
     ".write": "auth.uid == $uid", 
     "tokens": { 
      ".validate": "!data.exists() || (newData.val() < data.val())" 
     } 
     } 
    } 
    } 
} 

至於模擬器,我不知道任何用戶指南的,但設法瞭解如何通過實驗來使用它。這是理解規則的非常有效的工具。

下面是使用模擬器的一些情況:

當您打開模擬器,身份驗證是關閉的,它模擬一個未驗證用戶。要模擬閱讀,請點擊閱讀按鈕,輸入一個位置:例如/users/xyz/tokens,然後點擊運行。您會看到禁止該操作的規則上的紅色X.爲了模擬已認證的讀取,請單擊已認證的按鈕,併爲了方便起見,輸入一個簡單的用戶UID,如「Frank」。現在輸入地址/users/Frank/tokens,點擊運行並觀察讀取成功。

您可以爲寫入,輸入位置,授權設置和值進行類似的測試。

+0

我不確定你是否正確,在模擬器中我能夠成功寫入,即使我在根目錄下有「寫入」:「false」。在模擬器中試一試。但是你是正確的,它不會以其他方式工作。<<如果父層次結構中的任何安全規則授予訪問權限,那麼它是允許的。所以你不能在父級將安全設置爲TRUE,然後在子路徑中撤銷>> – Learn2Code

+0

,但我的主要原因是要找出如何執行令牌規則,只允許用戶減少值並且永不增加它!?你有什麼想法!? – Learn2Code

+0

@ Learn2Code:我正在使用您的規則,無法寫入。你指定哪個位置? –