在延續我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
異常。在這個時間點出來的想法。有人能指引我朝着正確的方向嗎?我提到了我之前提出的很多帖子,但是對於我的糟糕之處,我無法從中獲得很多信息。希望找到一些清晰的解釋,說明爲什麼規則驗證失敗,以及爲什麼數據會按照上述第一條規則插入。
你說_Even空數據獲取inserted_。 [文檔](https://firebase.google.com/docs/database/security/securing-data#validating_data)解釋說:「.validate規則僅針對非空值進行評估」 –
Firebase提供的模擬器控制檯是測試規則並查看哪些部分規則適用於讀取或寫入操作的便捷方式。 –
@qbix ..所以,即使我將'newData.val()。length <100 && newData.val()。length> 10'添加到它不驗證的任何屬性? –