【问题标题】:Firebase security rules multiple queries needed to get childrenFirebase 安全规则需要获取孩子的多个查询
【发布时间】:2020-07-12 22:20:24
【问题描述】:

在我的数据库和我的安全规则中有一个名为“设置”的表,非授权用户只能访问其中的两个孩子。

  "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());
    }
});

【问题讨论】:

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


    【解决方案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",
    },
    

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

    【讨论】:

    • 感谢您的回答。在这种情况下,您建议的解决方案似乎很好。但是例如,我的数据库中有问题,我不能让用户看到答案。但是当我将其设置为 false 时,他们将无权检查它是对还是错。所以我将它设置为“auth!= null”,现在他们可以访问答案。我担心的是他们是否可以找到一种方法来访问应用程序之外的答案,或者入侵它或其他东西。我不知道我是否设法解释了我的问题,但再次感谢您的解决方案。
    • 我没有投票权,但感谢您的帮助。
    猜你喜欢
    • 2017-01-02
    • 1970-01-01
    • 2015-11-13
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    相关资源
    最近更新 更多