Firebase实时数据库安全规则允许更新但未设置

时间:2020-11-07 20:29:31

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

这些是我与数据库中 users 节点有关的安全规则。

    "users": {
      "$uid": {
        ".read": "auth != null && $uid === auth.uid",
        "$user_nodes": {
          ".write": "(auth != null && $uid === auth.uid) || (auth == null && $user_nodes.contains('connection'))"
        }
      }
    }

使用这些规则进行身份验证后,尝试在我的 auth.uid 下读取全部信息,一切正常。由于某些原因,虽然不允许整个节点进行 set 操作,但允许进行 update 操作。有人可以告诉我为什么会这样吗?

编辑:因此,在代码中,读取操作将类似于以下内容:

userRef.child(auth.getCurrentUser().getUid()).addListenerForSingleValueEvent(new ValueEventListener() {...});

设置操作如下所示:

userRef.child(auth.getCurrentUser().getUid()).setValue(...);

我无法向您显示确切的代码,因为我在规则游乐场中测试规则时实际上遇到了我上面解释的行为。

1 个答案:

答案 0 :(得分:1)

这是您的代码:

userRef.child(auth.getCurrentUser().getUid()).setValue(...);

此代码尝试对/users/$uid进行设置,根据您的安全规则,这是不允许的。因此,如果写入被拒绝,则按预期运行。

根据您的规则,客户端可以写入或删除任何任何子节点,但它本身不能写入或删除/users/$uid。这就是为什么update语句起作用的原因:该语句有效地对set()调用中存在的每个属性执行update操作,而根据 规则。

通过考虑删除操作,最容易看到这里的区别:您的规则允许用户删除/users/$uid的任何子节点,但他们不能一口气删除/users/$uid