在延续我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'添加到它不验证的任何属性? –