【问题标题】:Firebase rules, limiting access to only participating usersFirebase 规则,仅限参与用户访问
【发布时间】:2018-03-17 17:28:46
【问题描述】:

尝试实施,以便用户只能访问用户正在玩的游戏的游戏数据。 基本上,如果用户是玩家列表的一部分,用户应该能够阅读。我在所有 $GameID 中都有参与玩家的列表。 所有用户都有自己唯一的用户名,存储在用户 -> FirebaseID -> 用户名值下。

在模拟读取用户所在的 $GameID 中的孩子时,我可以获得以下工作,但当我在我的应用中尝试 lite 时,它​​不会授予用户访问权限。

应用内调用:

GamesDataDatabase = FirebaseDatabase.getInstance().getReference("Games");
GamesDataDatabase.limitToFirst(50).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            ......

规则:

"Games": {
      "$GameID": {
                ".read": "root.child('Games').child($GameID).child('metaData').child('players').child(root.child('Users').child(auth.uid).child('username').val()).exists()",

如果我用 root.child('Games').child($GameID) 替换 "data" 似乎没有任何区别

数据结构:

反复尝试,但似乎无法让这条规则发挥作用...... :(

【问题讨论】:

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


    【解决方案1】:

    问题从这里开始代码:

    GamesDataDatabase = FirebaseDatabase.getInstance().getReference("Games");
    GamesDataDatabase.limitToFirst(50).addListenerForSingleValueEvent(...
    

    此代码仅在用户拥有/Games 的读取权限时才有效。如果他们没有对/Games 的读取权限,它将失败并显示“权限被拒绝”。

    再加上您无法在较低级别取消权限这一事实,这意味着您无法使用 Firebase 安全规则来过滤数据。

    这称为"rules are not filters" in the Firebase documentation,对于不熟悉 Firebase 安全模型的开发人员来说,这是一个常见的困惑来源。我建议您学习一些previous questions and answers 以了解更多信息。

    【讨论】:

    • 如果我迁移到 Cloud Firsestore(新的测试版程序),这会起作用吗?
    • 我认为使用此处描述的规则确实可以做到这一点:firebase.google.com/docs/firestore/security/… 但我还没有尝试过。
    • 是否可以在游戏中添加 read: false 并且由于 Firebase 实时数据库的建立,它应该检查下一个级别(子级)的访问权限?我尝试了这个但得到了相同的结果,我的应用程序中的用户没有访问权限......(即使模拟提供访问权限......)
    • 只有当用户拥有/Games 的读取权限时,附加到/Games 的侦听器才会起作用。如果他们没有对/Games 的读取权限,它将失败并显示“权限被拒绝”。
    猜你喜欢
    • 2020-08-15
    • 2017-01-25
    • 2016-12-08
    • 1970-01-01
    • 2017-03-10
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    相关资源
    最近更新 更多