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

对不起说不过好运.. :( –