有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Firebase安全规则获取子级所需的多个查询

在我的数据库和安全规则中有一个名为Settings的表,非授权用户只能访问其中两个子项

  "Settings":{ 
    ".read": "auth != null",
    ".write": "root.child('Users').child(auth.uid).child('rank').val() == 3",
    "$id":{
      ".read": "$id == 'maintenance' || $id == 'welcomeList'"
    }
},

但这样一来,我无法使用以下查询获得设置:

settingsRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        settings = dataSnapshot.getValue(Settings.class));
    }
});

我必须询问两次才能得到我想要的。还有别的办法吗?因为我将来需要两个以上的孩子,我不想最后有5个不同的查询

settingsRef.child("maintenance").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        settings.setMaintenance(dataSnapshot.getValue(Integer.class));
    }
});

settingsRef.child("welcomeList").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {              
         settings.setWelcomeList(dataSnapshot.getValue());
    }
});

共 (1) 个答案

  1. # 1 楼答案

    安全规则不会过滤数据。这意味着,在当前的数据模型中,确实需要执行两个读取操作

    常见的解决方案是将公共设置和“稍微少一点”的公共设置分为两个顶级节点:

    "Settings":{ 
        ".read": "auth != null",
        ".write": "root.child('Users').child(auth.uid).child('rank').val() == 3",
    },
    "PublicSettings":{ 
        ".read": true,
        ".write": "root.child('Users').child(auth.uid).child('rank').val() == 3",
    },
    

    现在,所有用户都必须执行两次读取,一次用于需要身份验证的设置,另一次用于公共设置。但不管定义了多少公共属性,它现在都需要两次读取