0

在延續我previous question我有如下的設計我的應用程序。火力地堡規則驗證並不驗證數據

設計

  • 誰可以登錄到應用
  • 已登錄用戶創造顧客,這將在節點 ,其價值將被記錄在用戶標識當前被存儲在用戶

這裏是我通過我的Android應用程序添加數據。

FirebaseInstance mFirebaseInstance = FirebaseDatabase.getInstance(); 
FirebaseDatabase mFirebaseDatabase = mFirebaseInstance.getReference("tbl-customers").child(FirebaseAuth.getInstance().getCurrentUser().getUid()); 
//This will create or fetch user id node under tbl-customers. 

btnSave.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      String name = inputName.getText().toString(); 
      String email = inputCode.getText().toString(); 
      String limit= inputLimit.getText().toString(); 
      createUser(name, email,limit); 
     } 
}); 


private void createUser(String name, String email,String limit) { 
    userId = mFirebaseDatabase.push().getKey(); 
    Customer customer = new Customer(name, email,limit); 

    mFirebaseDatabase.child(userId).setValue(customer); 
} 

就是這樣。在數據庫中,就是以某種方式表示如下:

tbl-customers 
|___loggedInUserId1 
    |___customerID1 
     |___customerName 
     |___customerCode 
     |___customerLimit 
    |___customerID2 
     |___customerName 
     |___customerCode 
     |___customerLimit 
    |___customerID3 
     |___customerName 
     |___customerCode 
     |___customerLimit 
|___loggedInUserId2 
    |___customerID4 
     |___customerName 
     |___customerCode 
     |___customerLimit 

,我必須定義爲

{ 
    "rules": { 
     "tbl-customers": { 
      ".read": "auth != null", 
      ".write": "auth != null", 
      "$custId": { 
       "customerName": { 
        ".validate": "newData.isString() && newData.val().length < 100 && newData.val().length > 8" 
       }, 
       "customerCode": { 
        ".validate": "newData.isString() && newData.val().length<4 && !newData.exists() && newData.val().length>1" 
       }, 
       "customerLimit": {} 
      } 
     } 
    } 
} 

不幸的是規則,數據插入,而不考慮任何的爲每個屬性編寫的驗證。 即使是空數據被插入

我開始思考寫的規則是否合理的結構,因爲如果我看到插入的數據,然後它有3個級別 - tbl-customer-->loggedInUserId-->customerId但規則已經只爲tbl-customer-->customerId寫的。

所以我更改如下的rules。通過包括

{ 
    "rules": { 
     "tbl-customers": { 
      ".read": "auth != null", 
      ".write": "auth != null", 
      "$user_id": { 
       ".validate": "auth.uid===$user_id", 
       "$custId": { 
        "customerName": { 
         ".validate": "newData.isString() && newData.val().length < 100" 
        }, 
        "customerCode": { 
         ".validate": "newData.isString() && newData.val().length<4 && !newData.exists()" 
        }, 
        "customerLimit": {} 
       } 
      } 

     } 
    } 
} 

它延伸到一個多層次,

"$user_id": { 
      ".validate": "auth.uid===$user_id" 
      ... 
} 

但現在這將引發Permission Denied異常。在這個時間點出來的想法。有人能指引我朝着正確的方向嗎?我提到了我之前提出的很多帖子,但是對於我的糟糕之處,我無法從中獲得很多信息。希望找到一些清晰的解釋,說明爲什麼規則驗證失敗,以及爲什麼數據會按照上述第一條規則插入。

+1

你說_Even空數據獲取inserted_。 [文檔](https://firebase.google.com/docs/database/security/securing-data#validating_data)解釋說:「.validate規則僅針對非空值進行評估」 –

+2

Firebase提供的模擬器控制檯是測試規則並查看哪些部分規則適用於讀取或寫入操作的便捷方式。 –

+0

@qbix ..所以,即使我將'newData.val()。length <100 && newData.val()。length> 10'添加到它不驗證的任何屬性? –

回答

2

我在這裏可能是錯的,但.read和.write規則將永遠在你的樹上級聯下來,無論在哪裏,「.write」:「auth!= null」這行最有可能是你面對問題。

這將是最好的移動這個規則裏的「.validate」:‘auth.uid === $ user_ID的’規則,並刪除了驗證規則。然後,您將其更改爲「auth.uid == $ user_id」。我相信'驗證'規則只是在特定地點接受書面意見,然後接受或拒絕。

這是我認爲它應該:

{ 
    "rules": { 
     "tbl-customers": { 
      ".read": "auth != null" 
      "$user_id": { 
       ".write": "auth.uid === $user_id" 
       "$custId": { 
        "customerName": { 
         ".validate": "newData.isString() && newData.val().length < 100" 
        }, 
        "customerCode": { 
         ".validate": "newData.isString() && newData.val().length<4 && !newData.exists()" 
        }, 
        "customerLimit": {} 
       } 
      } 

     } 
    } 
} 

這種結構將允許所有登錄用戶讀取數據,而如果你願意的話,類似你可以進一步限制到$ USER_ID位置寫規則目前就位。這將只允許匹配$ user_id讀寫權限的用戶。

爲例

要添加到這一點,這是我設置了較早前的結構,將允許管理員添加用戶的能力:

{ 
    "rules": { 
     "Administrator": { 
      ".read": "auth != null" 
     }, 
     "Users": { 
     "$user_id": { 
      ".write": "$user_id === auth.uid", 
      ".read": "$user_id === auth.uid" 
     } 
     } 
    } 
} 
+0

對不起說不過好運.. :( –