0

我在使用Firebase規則時遇到問題。基本上,我已經叫根文件夾「用戶」,包含再次含有數據的許多usersIDs,恰恰是這樣的:運行下面的代碼時Firebase安全規則不起作用

users { 
    userid1 { 
     info_user { 
      a: { 
       a1: whatever 
       a2: whatever  
       a3: { 
        a3.1: whatever 
        a3.2: whatever 
        a3.3: whatever 
        a3.n: whatever 
       } 
      } 
      n: {} ... 
     } 
    }, 
    userid2 {}, ...n 
} 

一切都正常工作,如果沒有安全規則,如:

{rules {".read" : true, ".write" : true}} 

function getUserInfo() { 
    var dbRef = firebase.database(); 
    var myArray = []; 
    dbRef.ref('users').on('child_added', function(snapshot) { 
     snapshot.forEach(function(childSnapshot) { 
      myArray = (childSnapshot.val().a3); 
      // do something 
     }); 
    }); 
} 

我的挑戰是更改安全規則而不更改數據庫結構。

所以,我試圖做這樣的事情:

{ 
    "rules" : { 
     ".read" : false, 
     ".write" : false, 
     "users": { 
      "$userid": { 
       "info_user": { 
        "a":{ 
         ".read": "auth != null", 
         ".write": "(root.child('r').child('w').hasChild(auth.uid))", 
         "a1":{".validate": "newData.isString()"}, 
         "a2":{".validate": "newData.isString()"}, 
         "a3":{".validate": "newData.isString()"} 
        }, 
        "n": { 
         ".read": "auth != null", 
         ".write": "$user_id === auth.uid" 
        } 
       } 
      } 
     } 
    } 
} 

預期的結果是讀取節點A3當用戶進行身份驗證。

如何做到這一點?

回答

2

Firebase數據庫讀取權限在您首次附加偵聽器時執行。因此,當您將聽衆附加到dbRef.ref('users')時,您必須具有/users的讀權限。在你的安全規則中,情況並非如此。

制定規則的工作,向上移動讀取權限`用戶:

{ 
    "rules" : { 
    "users": { 
     ".read" : "auth != null", 
     ... 

注意許可落下下來。因此,一旦您授予用戶對/users的讀取權限,他們就可以訪問/users下的所有數據。您無法爲此處的特定節點獲取此權限。

這導致了保護您的Firebase數據庫的一個缺陷:規則不能用於過濾數據。欲瞭解更多信息,請參閱Firebase documentation on "rules are not filters",這answer about it和更多的questions from developers struggling with the concept