Firebase规则验证不会验证数据

时间:2017-02-16 12:43:54

标签: android firebase firebase-realtime-database firebase-authentication firebase-security

继续我的 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 个答案:

答案 0 :(得分: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"
        }
      }
  }
}